const转发参考给出错误C2440:“正在初始化”:无法从“ const std :: string”转换为“ const std :: string &&”

dar*_*une 6 c++ forward-reference c++17

以下给出了编译器错误:

  #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;
  }
Run Code Online (Sandbox Code Playgroud)

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

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

动机:

对于函数等内部的“正常编程工作”,可以说类似这样的东西很棒:“我不在乎它是值还是引用-但我不会在其余函数中更改它”

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

相关问题: 为什么添加const会使通用引用成为右值

phö*_*hön 5

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

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

  • 常量左值引用
  • 左值引用
  • 常量右值引用
  • 右值引用
  • 此外,它将延长返回值的寿命

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

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