簡體   English   中英

關於重載運算符的ADL或命名沖突是否有不同的規則?

[英]Are there different rules regarding ADL or naming clashes with regard to overloaded operators?

我認為這個例子最能說明我的問題:

namespace N {

    class C {
    public:
        friend bool operator==(const C& c, const C& x) {
            return true;
        }
        friend bool f(const C& c, const C& x) {
            return true;
        }
    };

    class D {
    public:
        bool operator==(const D& x) {
            bool a = C{} == C{};      // this works
            return true;
        }
        bool f(const D& x) {
            bool a = f(C{}, C{});     // this does not work
            return true;
        }
    };
}

我一直認為重載運算符就像函數一樣,除了'調用語法',如果你願意的話。 我剛才注意到ADL或名稱查找規則中的上述差異(我不知道哪一個)。

有人可以解釋為什么找到bool operator==(const C& c, const C& x)但是bool f(const C& c, const C& x)不是?

你的D::f 隱藏了 C::f ; 如果你將后者重命名為C::g並調整調用,那么它工作正常(顯示該函數可以找到訪問得很好)。

您的代碼實際上並不直接調用操作符函數,但這是通過語言為您完成的。 因此,您沒有使用運算符函數的名稱 ,因此不應用名稱隱藏。

如果你編寫operator==(C{}, C{}) (而不是C{} == C{} ),那么你會看到與f(C{}, C{})相同的行為( 演示 ) 。

所以,當你說“我總是把重載的操作符視為除了'調用語法'之外的功能之外,如果你願意的話”,那么你已經觸及了頭腦。


這是你的一些標准:

[C++11: 13.5/4]:通常不直接調用運算符函數; 相反,它們被調用來評估它們實現的運算符(13.5.1 - 13.5.7)。 但是,可以使用operator-function-id作為函數調用語法(5.2.2)中函數的名稱來顯式調用它們。 [例如:

 complex z = a.operator+(b); // complex z = a+b; void* p = operator new(sizeof(int)*n); 

- 末端的例子]

[C++11: 3.3.7/4]: [..] 4)在成員函數中聲明的名稱隱藏了一個同名的聲明,其范圍擴展到或超過了成員函數類的末尾。 [..]

[C++11: 3/4]:名稱是使用標識符 (2.11), operator-function-id (13.5), literal-operator-id (13.5.8), conversion-function-id (12.3) .2),或表示實體或標簽的 模板ID (14.2)(6.6.4,6.1)。

(這里的[qualified] operator-function-id::N::C::operator== 。)

暫無
暫無

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

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