問題
std::string fun() { return std::string("123"); }
int main() {
fun() = "123"; // 可以通過C++11引入的引用限定符禁用掉這種賦值方式
return system("pause");
}
解決方案
看不懂的部分代表還沒有弄明白右值引用玻熙。
class A {
public:
A & operator=(const A & rhs) & = default; // 只能向非const左值賦值
void f1() & {} // 只有非const左值能調(diào)用f1
void f2() const & {} // 任何A類型對(duì)象都能調(diào)用f2饥追,因?yàn)榭梢詫⒁粋€(gè)const左值引用綁定到任何值(包括左值和右值)
};
class B {
public:
B & operator=(const B & rhs) && = default; // 只能向非const右值賦值
void f1() && {} // 只有非const右值能調(diào)用這個(gè)函數(shù)
void f2() const && {} // 任何右值(包括const或非const)都能調(diào)用這個(gè)函數(shù)
};
A fun1() { return A(); } // 返回一個(gè)非const的右值
const A fun2() { return A(); } // 返回一個(gè)const的右值
B fun3() { return B(); } // 返回一個(gè)非const的右值
const B fun4() { return B(); } // 返回一個(gè)const的右值
int main() {
// A()和B()產(chǎn)生一個(gè)非const右值
fun1() = A(); // 錯(cuò)誤
fun2() = A(); // 錯(cuò)誤
fun3() = B();
fun4() = B(); // 錯(cuò)誤
A().f1(); // 錯(cuò)誤
A().f2();
B().f1();
B().f2();
return system("pause");
}