为什么我们不能实现两个方法`getAB()&&`和`getAB()`?

时间:2017-06-10 21:36:25

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

为什么我们不能同时实施operator<<()std::cin两种方法,但可以实现其中任何一种方法?

  1. 作品:http://ideone.com/4EgObJ
  2. 代码:

    getAB() &&
    1. 作品:http://ideone.com/m9d0Tz
    2. 代码:

      getAB()
      1. 不要有效:http://ideone.com/QIQtZ5
      2. 代码:

        struct Beta {
          Beta_ab ab;
          Beta_ab && getAB() && { cout << "1"; return move(ab); }
        };
        
        int main() {    
            Beta_ab ab = Beta().getAB();
        
            return 0;
        }
        

        为什么前两个代码示例有效,但最后一个示例不起作用?

1 个答案:

答案 0 :(得分:8)

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

  

具有相同名称和相同 parameter-type-list 的成员函数声明以及具有相同名称的成员函数模板声明,相同的 parameter-type-list ,并且如果其中任何一个(但不是全部)具有 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
};
  

- 结束示例]

我并不完全清楚为什么我们有这个规则,但那就是它的本质。 (虽然我认为尝试在重载决策规则中使用某些东西的替代方案至少需要一些工作。)

解决方案很明显:在&重载中添加左值("2")ref-qualifier,这样一个只接受rvalues,一个只接受左值。