【问题标题】:Different behaviour between "int &&" and "auto &&"“int &&”和“auto &&”之间的不同行为
【发布时间】:2015-12-11 16:44:11
【问题描述】:

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

int x = 5;

int && y = x;

它将无法编译,并显示一个错误,指出右值引用无法绑定到左值。

但是如果我这样做:

int x = 5;

auto && y = x;

它编译没有错误。为什么会这样?我试图获取y 的类型,但typeid() 带走了引用属性。 auto && 是否会根据分配的内容自动折叠为 &&&

【问题讨论】:

标签: c++ c++11


【解决方案1】:

在第一种情况int && y 中,变量y 只能绑定到x 不能绑定的右值

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

auto && y = x;

由于x是一个左值,所以auto被推导出为int&,因此变为:

int& && y = x;

引用折叠后变成:

int & y = x;

这很好。


要更详细地了解它,请阅读以下内容:

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

  • 参考折叠

希望对您有所帮助。

【讨论】:

  • C++ 标准的工作文件草案在 14.8.2.1 [temp.deduct.call] 第 3 段中定义了术语 forwarding reference(即相应的提案在一点)。
  • @DietmarKühl,谢谢!!!一段时间以来,我一直在与不恰当的“通用参考”作斗争。
【解决方案2】:

int&& 是对int 的右值引用。 而auto&&universal reference

【讨论】:

  • 我不喜欢通用参考这个词。它们没有任何普遍性。
  • @SergeyA 这个词的好处是,您无需我挥手就能立即理解我。我很重视这一点。
  • Max,见上文 - 现在我们有了一个合适的术语。
  • @SergeyA 我今晚要在胸前纹上“转发参考”。
  • 我当然很想看这张照片!
【解决方案3】:

在第二个示例中,auto(在auto&& 中)可以是使代码格式正确的任何内容。在这种情况下,int& && 格式正确,因为 int& && 折叠为 int& - 因此一切正常。

【讨论】:

    猜你喜欢
    • 2020-11-13
    • 2016-08-02
    • 2014-11-01
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多