[英]User-defined implicit conversion of an enum class when calling an overloaded operator fails
考慮以下示例:
struct ConvertibleStruct {};
enum class ConvertibleEC {};
struct Target {
// Implicit conversion constructors
Target(ConvertibleStruct) {}
Target(ConvertibleEC) {}
};
Target operator~(const Target& t) {
return t;
}
Target anotherFunction(const Target& t) {
return t;
}
int main() {
ConvertibleStruct t;
ConvertibleEC ec;
~t; // 1. Works finding the operator overloaded above
~ec; // 2. Fails to compile on clang 3.4 and gcc 4.8.2
operator~(ec); // 3. Works finding the operator overloaded above
anotherFunction(ec); // 4. Works
}
編譯器版本:
以上發現適用於clang 3.4
和gcc 4.8.2
。 測試2.實際上使用-std=c++11
在gcc 4.7.3
可以正常編譯。 可能是早期GCC C ++ 11實施中的錯誤?
斷言:
~
運算符時會檢查用戶定義的隱式轉換。 enum class
對象。 問題:
第二個測試, ~ec
跑入名稱查找的運營商在表達式一個特點:[over.match.oper] / 3(從“古” N3797):
對於一元運算符
@
,其操作數的類型為cv不合格版本為T1
[...]非成員候選集是在表達式的上下文中根據不合格函數調用中用於名稱查找的常規規則對
operator@
進行不合格查找的結果,只是忽略了所有成員函數。 但是,如果沒有操作數具有類類型,則當T1
是枚舉類型 [。] 時,查找集中只有那些具有第一個參數類型T1
或“對(可能是cv限定的)T1
引用”的非成員函數 。 。] 是候選函數 。
因此,對於將一元運算符應用於ConvertibleEC
類型的操作數的表達式,不應為::operator~(const Target&)
查找/使用。
對於第一個~t
,操作數是類類型的,並且上面的異常不適用。
第三個和第四個測試都不使用運算符查找,而是通常使用不合格的查找。 通常的不合格查找將找到::operator~(const Target&)
(在情況1和3中)和anotherFunction
(在情況4中)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.