次の例を検討してください。
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. 実際には で問題なくコンパイルさgcc 4.7.3
れ-std=c++11
ます。おそらく初期の GCC C++11 実装のバグ?
アサーション:
- 1. がコンパイルされると、
~
オペレーターを呼び出すときにユーザー定義の暗黙的な変換がチェックされます。 - 4. コンパイルすると、ユーザー定義の暗黙的な変換が
enum class
オブジェクトに対してチェックされます。
質問:
- 上記の主張は正しいですか?
- もしそうなら、なぜ 2. コンパイルに失敗するのですか?
- 2. はコンパイルに失敗するのに、なぜ 3. はコンパイルされるのでしょうか?