簡體   English   中英

調用重載運算符時,用戶定義的枚舉類的隱式轉換失敗

[英]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.4gcc 4.8.2 測試2.實際上使用-std=c++11gcc 4.7.3可以正常編譯。 可能是早期GCC C ++ 11實施中的錯誤?

斷言:

  • 鑒於1.編譯,因此在調用~運算符時會檢查用戶定義的隱式轉換。
  • 給定4.編譯后,將檢查用戶定義的隱式轉換中的enum class對象。

問題:

  • 以上說法正確嗎?
  • 如果是,為什么2.無法編譯?
  • 鑒於2.編譯失敗,為什么3.編譯?

第二個測試, ~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.

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