以下给出了编译器错误:

  #include <string>

  const std::string& get_name();

  int main(){
    auto&& name1 = get_name();//should bind to whatever
    const auto& name2 = get_name();//also ok
    const auto&& name3 = get_name();//<-not ok, why ?
    return 0;
  }

链接到Godbolt:https://godbolt.org/z/l6IQQ7

如果我使用const auto&,它将编译-但这不会绑定(bind)到值。auto&&将被绑定(bind)到任何东西,因此自然也可以工作。
但是,在这种情况下const auto&&不绑定(bind)背后的逻辑是什么?
我知道auto&&将保留常量性-但是有没有办法明确显示const并同时与引用/值无关?

动机:

对于函数内部的“正常编程工作”,最好能说这样的话:“我不在乎它是值还是引用-但我不会在其余函数中更改它”。

给定当前语言,这应该是可能的。

相关问题: Why adding `const` makes the universal reference as rvalue

最佳答案



您已经为您的动机准备了解决方案:使用const auto&const auto&将绑定(bind)到:

  • const左值引用
  • 左值引用
  • 常量右值引用
  • rvalue引用
  • 此外,它将延长返回值的生命周期

  • 这样您便拥有了所需的一切。是的,它与const rvalue引用不同,但是如果您仅使用它就没有关系,因为因为它是const,所以无论如何您都无法从它中移出。

    最后说明:auto&&将始终是引用。它是一个带有推论的转发引用,但是您的最终变量将始终是引用(rvalue ref或lvalue ref,但绝不能是“value”)。也许那是/是一个误解?

    关于c++ - const转发引用给出错误C2440 : 'initializing' : cannot convert from 'const std::string' to 'const std::string &&' ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58299331/

    10-16 20:13