6

以下给出了编译器错误:

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

神螺栓链接: https ://godbolt.org/z/l6IQQ7

如果我使用const auto&它编译 - 但这不会绑定到值。 auto&&将绑定到任何东西,这样自然也能正常工作。const auto&&但是,在这种情况下不绑定背后的逻辑是什么?我知道auto&&会保留 constness - 但是有没有一种方法可以const明确并且同时是参考/价值不可知论

动机:

对于函数内部的“正常编程工作”等,如果能够说类似的话会很棒:“我不在乎它是一个值还是一个引用 - 但我不会为函数的其余部分更改它”

考虑到当前的语言,这应该是可能的。

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

4

1 回答 1

5

对于函数内部的“正常编程工作”等,如果能够说出类似这样的话会很棒:“我不在乎它是值还是引用 - 但我不会为函数的其余部分更改它”。

您已经有了激励您的解决方案:使用const auto&. const auto&将绑定到:

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

所以你得到了你需要的一切。是的,它与 const rvalue ref 不同,但如果你只使用它,那并不重要,因为无论如何你都无法从中移动,因为它是 const。

最后一点:auto&&将永远是一个参考。它是一个带有扣除的转发引用,但您的最终变量将始终是一个引用(右值引用或左值引用,但绝不是“值”)。也许那是/是一个误解?

于 2019-10-09T08:20:33.673 回答