[英]Difference in choice of const-overload for member and non-member operators on temporary
回答這個問題時,我發現rvalue的重載分辨率與成員和非成員運算符之間的引用有一個有趣的區別。
給定兩個非成員運算符,一個將左參數作為const傳遞,另一個作為非const傳遞,GCC 4.4.3和MSVC2010在使用rvalue調用時選擇const版本。
但是,給定兩個成員運算符,一個const和一個非const,兩個編譯器都選擇非const版本。
我假設兩個編譯器都遵守這個標准,所以我很好奇為什么成員和非成員之間的const重載決議之間存在這種差異。 請賜教:)
這里有一些代碼來說明差異:
#include <iostream>
class C {
public:
C(int i) { }
/*
C operator<<(C const &rhs) {
std::cout << "member non-const" << std::endl;
return *this;
}
C operator<<(C const &rhs) const {
std::cout << "member const" << std::endl;
return *this;
}
//*/
};
C operator<<(C &lhs, C const &rhs) {
std::cout << "non-member non-const" << std::endl;
return lhs;
}
C operator<<(C const &lhs, C const &rhs) {
std::cout << "non-member const" << std::endl;
return lhs;
}
int main() {
// Will print:
// "non-member const" when member operators are commented out
// "member non-const" when members are uncommented
C(5) << 6;
}
Rvalues不能綁定到引用到非const,因此只有free函數的reference-to-const重載是可行的: operator<<(C(5), 6);
。
這不適用於成員運算符,它只是C(5).operator<<(6)
,而C
-object不是函數參數。 你不得不說static_cast<const C &>(C(5)) << 6
拿到const版本有,因為它是常量性this
區分兩個成員運算符重載。
在成員和自由函數運算符的存在下,成員函數是首選,因此將所有這些放在一起就可以解釋觀察到的行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.