const 转发引用给出错误 C2440:'initializing':无法从 'const std::string' 转换为 'const std::string &&'

const forwarding reference gives error C2440: 'initializing': cannot convert from 'const std::string' to 'const std::string &&'

下面给出编译错误:

  #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;
  }

Link 神马:https://godbolt.org/z/l6IQQ7

如果我使用 const auto& 它会编译 - 但不会绑定到值。 auto&& 将绑定到任何东西,这样自然也能正常工作。 但是,在这种情况下 const auto&& 不具有约束力的背后逻辑是什么? 我知道 auto&& 会保留常量性——但有没有办法让 const 明确,同时 reference/value 不可知 ?

动机:

对于 'normal programming work' 内部函数等,如果能够这样说就好了:"I do not care if it's a value or reference - but I do not change it for the rest of the function".

鉴于当前的语言,这应该是可能的。

相关问题:

For 'normal programming work' inside functions etc. it would be great to be able to say something like: "I do not care if it's a value or reference - but I do not change it for the rest of the function".

您已经有了满足您动机的解决方案:使用 const auto&const auto& 将绑定到:

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

所以你得到了你需要的一切。是的,它不同于 const rvalue ref,但如果你只是使用它就没有关系,因为你无论如何都无法从它移动,因为它是 const.

最后说明:auto&& 将始终作为参考。它是一个带有推导的转发引用,但你的最终变量将始终是一个引用(右值引用或左值引用,但绝不是 "value")。也许 was/is 是一种误解?