在C++ 11中,如果我尝试这样做:
int x = 5; int && y = x;
它将无法编译,错误告诉r值引用无法绑定到左值.
但是,如果我这样做:
int x = 5; auto && y = x;
它编译没有错误.为什么会这样?我试图获得类型y
但typeid()
删除了引用属性.是auto &&
自动折叠到一个&
或&&
取决于分配的内容?
在第一种情况int && y
中,变量y
可以结合仅右值,其x
是没有的.
auto && y
然而,在第二种情况下,变量y
可以绑定到任何东西,因为y
无论如何都会推导出类型- 并且将相应地应用引用 - 折叠 - 这就是您的代码编译的原因:
auto && y = x;
由于x
是左值,auto
推断为int&
,因此它变成:
int& && y = x;
在参考折叠之后,它变成:
int & y = x;
这很好.
要更详细地了解它,请阅读:
通用参考(或转发参考,因为它已被提议用于改进术语)
参考折叠
希望有所帮助.