在C ++ 11中,如果我尝试这样做:
int x = 5;
int && y = x;
编译失败,错误告诉r值引用无法绑定到左值。
但是,如果我这样做:
int x = 5;
auto && y = x;
它编译没有错误。为什么会这样?我尝试获取y
的类型,但typeid()
删除了引用属性。 auto &&
是否会自动折叠为&
或&&
,具体取决于分配的内容?
答案 0 :(得分:9)
在第一种情况int && y
中,变量y
只能绑定到{em> rvalue ,x
不是。
然而,在第二种情况auto && y
中,变量y
可以绑定到任何内容,因为无论如何都会推导出y
的类型 - 并且将相应地应用引用 - 折叠 - 这就是你的代码编译的原因:
auto && y = x;
由于x
是左值,auto
推断为int&
,因此它变为:
int& && y = x;
并且在引用折叠之后,它变为:
int & y = x;
这很好。
要更详细地了解它,请阅读:
通用参考(或转发参考,因为它已被提议用于改进术语)
参考折叠
希望有所帮助。
答案 1 :(得分:2)
int&&
是对int
的r值引用。
而auto&&
是universal reference。
答案 2 :(得分:2)
在第二个示例中,auto
(在auto&&
中)将是使代码格式良好的任何内容。在这种情况下,int& &&
格式正确,因为int& &&
会崩溃到int&
- 因此一切正常。