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