簡體   English   中英

臨時成員和非成員操作員選擇const-overload的區別

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

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