以下 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 问题有关,但这些“仅”给出了问题的解决方案,没有任何解释(无论如何我都能够应用于我的特定问题)。
请注意,添加一个额外的重载强制转换运算符会operator float() const { return 3; }
导致除 SolarisStudio 之外的所有编译器都抱怨歧义。