我仍然对支持移动和转发而发明的规则感到困惑。我仍然不确定的一件事是:
是转发参考 just 右值引用(和
应用参考折叠规则)?
如果它是右值引用,那么该函数为什么会这样:
template<typename T>
void func(T&&);
不仅接受右值,还接受左值?
我不确定这个答案是否会让您满意,但我可以指出标准的相关部分。简而言之,参考T&&
“从语法上讲”始终是右值引用,但有时它最终声明的类型是左值引用类型。
当这种情况作为模板参数推导的结果发生时,整个构造被称为“转发引用”,作为一种方便的简写。 (这种情况需要引用折叠,但模板参数推导并不是引用折叠发生的唯一一次。)
现在,我们来看看标准措辞。首先我们有[dcl.ref](例如p2 http://eel.is/c++draft/dcl.ref#2, p6 http://eel.is/c++draft/dcl.ref#6):
使用声明的引用类型&
被称为左值参考,以及使用声明的引用类型&&
被称为右值引用. [...]
If a typedef 名称(9.1.3, 13.1) 或decl类型说明符(9.1.7.2) 表示类型TR
这是对类型的引用T
,尝试创建类型“左值引用”cv TR
”创建类型“左值引用T
“, 尽管
尝试创建“右值引用”类型cv TR
” 创建类型TR
. [Note:此规则称为引用折叠。 —end note]
最后,模板参数推导的情况在 [temp.deduct.call] 中处理p3 http://eel.is/c++draft/temp.deduct.call#3:
A 转发参考是对 cv-unqualified 模板参数的右值引用 [...]
换句话说,转发参考is一个右值引用,但它也接受左值。 (请注意,标准对“转发引用”的定义实际上并不需要推导模板参数,尽管这是您通常希望触发引用折叠行为的主要方式。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)