const转发引用导致错误C2440:'初始化': 无法将'const std::string'转换为'const std::string &&'。

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

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

如果我使用const auto&,它可以编译 - 但不会绑定到值。 auto&&将绑定到任何东西,因此自然也可以工作。 然而,为什么const auto&&在这种情况下不能绑定? 我知道auto&&将保留常量性 - 但是否有一种方法既显式地指定const,又同时是引用/值不可知的

动机:

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

当前语言应该支持这种做法。

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


1
这是一个重复问题,它询问模板类型推导,但由于规则在这种情况下与auto相同,我认为我们可以关闭它? - lubgr
@lubgr 我确实看到了- 它的框架不同 - 我正在寻求一个“解决方案” - darune
1
一个“解决方案”就是只使用const auto&。它可以绑定到任何东西。如果你以某种方式获得了一个const rvalue ref,你也不会得到任何优势。 - phön
@phön ty,这有点让人惊讶,请写一个带有解释的答案。 - darune
@phön 我的意思是,直觉上你会认为像那样返回到 'const reference' 的值会在该语句之后被销毁。 - darune
@darune 是的。但那是终身延长。您可以获得rvalue引用和const lvalue引用。https://en.cppreference.com/w/cpp/language/reference_initialization#Lifetime_of_a_temporary - phön
1个回答

5
在函数内部等“普通的编程工作”中,希望能够这样说:“我不在意它是值还是引用——但我不会在函数的其余部分更改它。”
你已经有了解决方案来实现你的动机:使用const auto&const auto&将绑定到:
- const左值引用 - 左值引用 - const右值引用 - 右值引用 - 此外,它将扩展返回值的生命周期
所以,你已经拥有了所需的一切。是的,它与const右值引用不同,但如果你只是使用它,那就无关紧要,因为你无法从它移动,因为它是const的。
最后注意:auto&&始终是一个引用。它是具有推断的转发引用,但是你的最终变量将始终是一个引用(右值引用或左值引用,但永远不是“值”)。也许这是/曾经是一个误解?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接