问题
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左值能调用f1
void f2() const & {} // 任何A类型对象都能调用f2,因为可以将一个const左值引用绑定到任何值(包括左值和右值)
};
class B {
public:
B & operator=(const B & rhs) && = default; // 只能向非const右值赋值
void f1() && {} // 只有非const右值能调用这个函数
void f2() const && {} // 任何右值(包括const或非const)都能调用这个函数
};
A fun1() { return A(); } // 返回一个非const的右值
const A fun2() { return A(); } // 返回一个const的右值
B fun3() { return B(); } // 返回一个非const的右值
const B fun4() { return B(); } // 返回一个const的右值
int main() {
// A()和B()产生一个非const右值
fun1() = A(); // 错误
fun2() = A(); // 错误
fun3() = B();
fun4() = B(); // 错误
A().f1(); // 错误
A().f2();
B().f1();
B().f2();
return system("pause");
}
网友评论