簡體   English   中英

A()= A() - 為什么要編譯?

[英]A() = A() - why does it compile?

class A {};

int main() {
 A() = A();
 return 0; 
}

為什么這段代碼會編譯? 不應該有一些錯誤,在賦值運算符的左側應該放置左值? 是A()左值? g ++ 4.7版本

對於內置類型,你是正確的:內置賦值運算符需要在左側有一個可修改的左值

但是,這不是使用內置運算符,而是由類隱式聲明的重載。 這是一個成員函數,相當於

A().operator=(A());

並且可以在rvalues上調用成員函數。

如果你真的想要,你可以使它不能用C ++ 11編譯:

class A {
    template <typename T>
    void operator=(T&&) && = delete; // no op= for rvalues

    // generate other special members normally
    A() = default;
    A(A const&) = default;
    A(A&&) = default;
    ~A() = default;
    // op= only for lvalues
    A& operator=(A&&) & = default;
    A& operator=(A const&) & = default;
};

int main() {
 A() = A(); // error
 return 0; 
}

實例

請注意各種operator=表單聲明結尾處的&&& (也稱為ref-qualifiers)。 這使得分別為左值和右值選擇這些聲明。 但是,rvalue版本在通過重載決策選擇時會導致程序格式錯誤,因為它已被刪除。

但是,默認生成的operator =沒有任何ref-qualifier,這意味着可以為lvalues和rvalues調用它; 這就是問題中的代碼編譯的原因,即使A()是一個右值。

C ++編譯器為所有類提供了一個默認構造函數,當你說A()= A()時,這就是你的代碼所發生的事情。 它只是使用無名對象調用構造函數,函數返回對構造對象的引用(隱式)。 而已...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM