【问题标题】:Why can't we implement both methods `getAB() &&` and `getAB()`? [duplicate]为什么我们不能同时实现 `getAB() &&` 和 `getAB()` 方法? [复制]
【发布时间】:2017-11-12 16:22:38
【问题描述】:

为什么我们不能实现getAB() &&getAB() 这两种方法,但可以实现其中任何一种?

  1. 作品:http://ideone.com/4EgObJ

代码:

struct Beta {
  Beta_ab ab;
  Beta_ab && getAB() && { cout << "1"; return move(ab); }
};

int main() {    
    Beta_ab ab = Beta().getAB();

    return 0;
}

  1. 作品:http://ideone.com/m9d0Tz

代码:

struct Beta {
  Beta_ab ab;
  Beta_ab && getAB() { cout << "2"; return move(ab); }
};

int main() {
    Beta b;
    Beta_ab ab = b.getAB();

    return 0;
}

  1. 有效:http://ideone.com/QIQtZ5

代码:

struct Beta {
  Beta_ab ab;
  Beta_ab && getAB() && { cout << "1"; return move(ab); }
  Beta_ab && getAB() { cout << "2"; return move(ab); }
};

int main() {
    Beta b;
    Beta_ab ab1 = b.getAB();

    Beta_ab ab2 = Beta().getAB();

    return 0;
}

为什么前两个示例代码有效,但最后一个示例无效?

【问题讨论】:

  • 与您的问题无关,但在创建MCVE 时请确保其中没有不相关的错误。不相关的错误会分散实际问题的注意力。我当然是在谈论您在 main 函数中对变量 ab 的重新定义。
  • 如果任何重载是引用限定的,那么 all 重载必须是引用限定的 - 将第二个重载更改为 Beta_ab &amp;&amp; getAB() &amp; { cout &lt;&lt; "2"; return move(ab); }。 (不作为答案发布,因为这肯定是一个骗局。)
  • 可以在左值右值上调用没有 ref 限定符的重载,例如 Beta_ab &amp;&amp; getAB()。带有右值引用限定符Beta_ab &amp;&amp; getAB() &amp;&amp; 的重载只能在右值上调用。因此,如果允许两者共存,则对右值的getAB() 调用将是不明确

标签: c++ c++11 c++14 move-semantics rvalue-reference


【解决方案1】:

标准部分 [over.load]/2.3:

具有相同名称和相同参数类型列表的成员函数声明以及具有相同名称和相同参数类型列表的成员函数模板声明>,并且如果其中任何一个(但不是全部)具有 ref-qualifier,则不能重载相同的模板参数列表。

[示例:

class Y {
  void h() &;
  void h() const &;    // OK
  void h() &&;         // OK, all declarations have a ref-qualifier
  void i() &;
  void i() const;      // ill-formed, prior declaration of i
                       // has a ref-qualifier
};

-- 结束示例]

我并不完全清楚为什么我们有这条规则,但就是这样。 (虽然我猜想尝试在重载解决规则中加入某些东西的替代方案至少需要一些工作。)

解决方案很明显:将左值 (&amp;) 引用限定符添加到您的 "2" 重载中,以便一个只接受右值,一个只接受左值。

【讨论】:

    猜你喜欢
    • 2013-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-14
    • 1970-01-01
    • 1970-01-01
    • 2014-02-15
    • 1970-01-01
    相关资源
    最近更新 更多