5

次の例を検討してください。

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. 実際には で問題なくコンパイルさgcc 4.7.3-std=c++11ます。おそらく初期の GCC C++11 実装のバグ?

アサーション:

  • 1. がコンパイルされると、~オペレーターを呼び出すときにユーザー定義の暗黙的な変換がチェックされます。
  • 4. コンパイルすると、ユーザー定義の暗黙的な変換がenum classオブジェクトに対してチェックされます。

質問:

  • 上記の主張は正しいですか?
  • もしそうなら、なぜ 2. コンパイルに失敗するのですか?
  • 2. はコンパイルに失敗するのに、なぜ 3. はコンパイルされるのでしょうか?
4

1 に答える 1