转发非引用类型的引用

2024-03-25

 template<typename T>
 void F(T&& x) {}

如果我们用 int& 类型的参数调用它,一切都清楚了 - 引用崩溃发生,我们仍然有左值引用。但是,如果我们用 int 参数调用它,会发生什么。我的想法:我们推导了类型 T=int,用右值引用修饰它,所以 F 接受 int&& 参数,用 int 类型调用它会导致错误。但实际上 F 将此类参数视为左值引用。左值引用从何而来?编译器应用什么规则从 int 获取 int& ?


从C++17开始,就有了这个概念转发参考在 C++ 标准中。通常,模板参数被扣除为非引用。但对于具体情况转发参考如果相应的参数是左值,则将该参数推导为引用。C++ 标准 (N4700)[temp.over.deduct.call]/3 https://timsong-cpp.github.io/cppwp/n4659/temp.deduct.call#3:

[...]A 转发参考是对 cv 无限定模板参数的右值引用,该参数不表示类模板的模板参数(在类模板参数推导 ([over.match.class.deduct]) 期间)。如果 P 是转发引用并且参数是左值,则使用类型“对 A 的左值引用”代替 A 进行类型推导。[...]

对于函数调用的关注,它与中的这段等效段落具有相同的含义C++11(N337) https://timsong-cpp.github.io/cppwp/n3337/temp.deduct.call#3 and C++14(N414) https://timsong-cpp.github.io/cppwp/n4140/temp.deduct.call#3[temp.over.deduct.call]/3:

[...]如果 P 是对 cv-unqualified 模板参数的右值引用,并且参数是左值,则使用类型“对 A 的左值引用”代替 A 进行类型推导[...]

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

转发非引用类型的引用 的相关文章

随机推荐