"int &&"和"auto &&"之间的不同行为

Jor*_*nzo 4 c++ c++11

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

int x = 5;

int && y = x;
Run Code Online (Sandbox Code Playgroud)

它将无法编译,错误告诉r值引用无法绑定到左值.

但是,如果我这样做:

int x = 5;

auto && y = x;
Run Code Online (Sandbox Code Playgroud)

它编译没有错误.为什么会这样?我试图获得类型ytypeid()删除了引用属性.是auto &&自动折叠到一个&&&取决于分配的内容?

Naw*_*waz 9

在第一种情况int && y中,变量y可以结合仅右值,其x是没有的.

auto && y然而,在第二种情况下,变量y可以绑定到任何东西,因为y无论如何都会推导出类型- 并且将相应地应用引用 - 折叠 - 这就是您的代码编译的原因:

auto && y = x;
Run Code Online (Sandbox Code Playgroud)

由于x是左值,auto推断为int&,因此它变成:

int& && y = x;
Run Code Online (Sandbox Code Playgroud)

在参考折叠之后,它变成:

int & y = x;
Run Code Online (Sandbox Code Playgroud)

这很好.


要更详细地了解它,请阅读:

  • 通用参考(或转发参考,因为它已被提议用于改进术语)

  • 参考折叠

希望有所帮助.