[英]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.