【问题标题】:Why does this rvalue reference bind to an lvalue?为什么这个右值引用绑定到左值?
【发布时间】:2018-01-13 21:09:41
【问题描述】:

我不明白为什么以下代码在 GCC 8.0 上编译:

decltype(auto) foo(int&& r) {
    return r;
}

foo中,r的声明类型是int&&,所以foo的返回类型也是int&&。但是r本身是左值,左值不能绑定右值引用。

我错过了什么吗?

【问题讨论】:

  • 转载gcc8,看来gcc8推导出返回类型为int&
  • @songyuanyao 他们声称代码可以编译,所以这不会是复制。
  • @BaummitAugen 固定代码用gcc8编译,而不是clang6
  • 看起来确实像一个 GCC 错误。但是请注意,如果您要返回带括号的 id 表达式(return (r);,它会按设计工作)。
  • @curiousguy12:顺便说一句,欢迎来到 StackOverflow。第一个问题很好,我们需要更多像你这样的人。

标签: c++ c++14 language-lawyer rvalue-reference decltype


【解决方案1】:

根据[dcl.spec.auto]/5,返回类型被推断为好像return 语句的操作数是decltype 的操作数。而[dcl.type.simple]/(4.2)明确指出,由于操作数没有括号,实体的类型就是decltype产生的类型,即int&&。事实上,r 是一个左值 ([expr.prim.id.unqual])。

幸运的是,这已在两年前被发现并归档为bug 64892。 (我想知道为什么没有人能抽出时间来解决这个问题?)

【讨论】:

    猜你喜欢
    • 2017-04-15
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 2016-06-09
    • 2017-12-06
    • 1970-01-01
    • 2014-10-31
    相关资源
    最近更新 更多