转发引用(又名通用引用)的整个前提是,这个函数:
template<typename T>
void f(T&&) { }
可以导致模板参数为 int&
或int
,取决于您是否使用 int a{}; f(a)
来调用它或f(5)
例如。但我认为这已经迈得太远了。因为当我有一个像
template<typename T>
auto g(T) -> void {}
然后它总是将模板参数解析为 int
,无论我如何调用它。尽管 auto h(int&) -> void {}
完全合法。
那么有哪些规则允许 f
的模板参数作为引用,但不是 g
的引用?
最佳答案
模板参数推导规则中有一个特定的异常(exception)情况,即函数参数的形式为 T&&
(cv-unqualified),其中 T
是模板参数。这种特殊情况可以在称为“转发引用”的问题中看到。
对于转发引用,如果函数参数是左值,则为 T
推导出左值引用,通常不会推导出引用类型。
通过尝试使用例如,您可以看到这确实是针对这种情况的特殊规则。 const T&&
而不是 T&&
,特殊规则不适用。在任何情况下,它都会推导出 T
的非引用类型,尽管函数调用可能无法实现。
关于c++ - 转发引用: reference parameter origin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70445266/