在下面的代码中,如果由于歧义而定义了多个强制转换运算符,我希望得到编译器错误。
#include <iostream>
#include <sstream>
struct A
{
operator const char*() { return "hello world\n"; }
operator float() { return 123.0F; }
//operator int() { return 49; }
};
int main()
{
A a;
std::stringstream ss;
ss << a;
std::cout << ss.str();
return 0;
}
相反,只要定义了一个数字强制转换操作符,它就会编译时没有错误,没有警告,并且优先使用数字强制转换operator const char *()
。声明的运算符的顺序没有区别。
但如果operator int()
和operator float()
都已定义,那么我从一开始就得到了我的预期:
'运算符&lt;&lt;'含糊不清
是否有强制转换的优先规则,或者为什么编译器默认选择数字强制转换?我明白我应该明确说明我的意思,但我的问题是关于编译器的默认选择。
<小时/> 编辑:使用编译器MSVC 2010
答案 0 :(得分:4)
根据C ++标准的第13.3.3.1节对转化进行排名。特别是,与您的示例相关的用户定义的转换序列受第13.3.3.1.2 / 1条规定:
“用户定义的转换序列包括初始标准转换序列,后跟用户定义的转换(12.3),然后是第二个标准转换序列。[...]如果用户定义的转换是由转换函数(12.3.2)指定,初始标准转换序列将源类型转换为转换函数的隐式对象参数。“
此处的所有转换序列都包含:
operator <<
。 这些转换序列都具有相同的排名。因此,呼叫应该是模糊的。如果不是,对我来说这是一个编译器错误。