c++ - 转发引用: reference parameter origin

标签 c++ templates forwarding-reference

转发引用(又名通用引用)的整个前提是,这个函数:

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/

相关文章:

c++ - 为什么通用引用不保持其参数的常量性?

c++ - 结构化绑定(bind)和转发引用混合得好吗?

c++ - seekg 不转到文件开头

c++ - 如何减少录音程序中的CPU消耗(c++)

c++ - 带指针的binary_search

c# - 使用 SWIG 从 C++ 初始化对 C# 共享指针的引用

c++ - 无法在 C++/Objective-C++ 代码中设置断点

c++ - 使用 Pair 模板实现 List 模板

c++ - 为模板类静态实例生成有效标识符的宏

c++ - 为什么通用引用不适用于数组?