【发布时间】:2013-05-14 04:51:40
【问题描述】:
以下 C++ 程序在我尝试过的所有编译器(gcc 4.6.3、llvm 3.0、icc 13.1.1、SolarisStudio 12.1/12.3)中编译时均未出现警告:
struct CClass
{
template<class T>
operator T() const { return 1; }
operator int() const { return 2; }
};
int main(void)
{
CClass x;
return static_cast<char>(x);
}
但是,除了 SolarisStudio 编译器之外的所有编译器都返回 2,SolarisStudio(任一版本)返回 1,我认为这是最合乎逻辑的结果。
使用 return x.operator char(); 会导致所有编译器返回 1。
显然,自从弄清楚这一点以来,我一直在使用后一种表示法。但是,我想知道哪个编译器是正确的以及为什么。 (人们会认为多数人规则,但这仍然不能解释为什么。)
这个问题似乎与 SO 问题 here、here 和 here 有关,但这些“仅”给出了问题的解决方案,没有解释(无论如何我都能够适用于我的特定问题)。
请注意,添加额外的重载强制转换运算符,例如 operator float() const { return 3; } 会导致除 SolarisStudio 之外的所有编译器都抱怨歧义。
【问题讨论】:
-
刚刚在我的编译器 G++ 4.8.0 中测试过,它返回 1。
-
G++ 4.7.2 也返回 1。对于
operator float(),没有任何歧义的抱怨。 -
g++ 返回一个从 4.7 开始的 gcc.godbolt.org
-
这是糟糕的代码。避免使用通用(非专业或非限制 [例如通过
std::enable_if<>])模板转换运算符,因为这些可能会导致不必要的和不可预见的转换。
标签: c++ templates casting operator-overloading overload-resolution