“int&&”之间的不同行为和“汽车&&”

时间:2015-12-11 16:44:12

标签: c++ c++11

在C ++ 11中,如果我尝试这样做:

int x = 5;

int && y = x;

编译失败,错误告诉r值引用无法绑定到左值。

但是,如果我这样做:

int x = 5;

auto && y = x;

它编译没有错误。为什么会这样?我尝试获取y的类型,但typeid()删除了引用属性。 auto &&是否会自动折叠为&&&,具体取决于分配的内容?

3 个答案:

答案 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& - 因此一切正常。