Ale*_*lex 7 c++ rvalue-reference move-semantics c++11 c++14
为什么我们不能同时实现的方法getAB() &&
和getAB()
,但可以实现其中任何一个?
码:
struct Beta {
Beta_ab ab;
Beta_ab && getAB() && { cout << "1"; return move(ab); }
};
int main() {
Beta_ab ab = Beta().getAB();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
码:
struct Beta {
Beta_ab ab;
Beta_ab && getAB() { cout << "2"; return move(ab); }
};
int main() {
Beta b;
Beta_ab ab = b.getAB();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
码:
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;
}
Run Code Online (Sandbox Code Playgroud)
为什么前两个代码示例有效,但最后一个示例不起作用?
标准部分[over.load] /2.3:
具有相同名称和相同参数类型列表的成员函数声明以及具有相同名称的成员函数模板声明,相同的参数类型列表和相同的模板参数列表(如果有的话)不能重载,但是并非所有人都有一个参赛资格赛.
[例:
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
};
Run Code Online (Sandbox Code Playgroud)
- 结束例子]
我并不完全清楚为什么我们有这个规则,但事实就是如此.(虽然我想尝试在重载决策规则中使用某些东西的替代方案至少需要一些工作.)
解决方案很明显:&
在"2"
重载中添加一个lvalue()ref-qualifier,这样一个只接受rvalues,一个只接受lvalues.