Why can't we implement both methods getAB() &&and getAB(), but can we implement either of them?
getAB() &&
getAB()
code:
struct Beta { Beta_ab ab; Beta_ab && getAB() && { cout << "1"; return move(ab); } }; int main() { Beta_ab ab = Beta().getAB(); return 0; }
struct Beta { Beta_ab ab; Beta_ab && getAB() { cout << "2"; return move(ab); } }; int main() { Beta b; Beta_ab ab = b.getAB(); return 0; }
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; }
Why do the first two code examples work, but the last example does not work?
Standard section [over.load] /2.3:
- , - , , - , , ref-.[:
- , - , , - , , ref-.
[:
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 };
- ]
, , . ( , - , .)
: ref- lvalue (&) "2", rvalues, lvalues.
&
"2"