★24.引用限定符

问题

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");
}

你可能感兴趣的:(★24.引用限定符)