★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");
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容