考虑以下示例:
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
with上编译得很好-std=c++11
。可能是早期 GCC C++11 实现中的一个错误?
断言:
- 鉴于 1. 编译,调用
~
运算符时会检查用户定义的隐式转换。 - 鉴于 4. 编译,用户定义的隐式转换会检查
enum class
对象。
问题:
- 上述说法正确吗?
- 如果是,为什么 2. 编译失败?
- 鉴于 2. 无法编译,为什么 3. 编译?