重载的强制转换运算符的优先级

时间:2013-01-16 14:13:05

标签: c++ visual-studio-2010

在下面的代码中,如果由于歧义而定义了多个强制转换运算符,我希望得到编译器错误。

#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

1 个答案:

答案 0 :(得分:4)

根据C ++标准的第13.3.3.1节对转化进行排名。特别是,与您的示例相关的用户定义的转换序列受第13.3.3.1.2 / 1条规定:

“用户定义的转换序列包括初始标准转换序列,后跟用户定义的转换(12.3),然后是第二个标准转换序列。[...]如果用户定义的转换是由转换函数(12.3.2)指定,初始标准转换序列将源类型转换为转换函数的隐式对象参数。“

此处的所有转换序列都包含:

  1. 虚构转换为转换函数的隐式对象参数的源类型;
  2. 用户定义的转化;
  3. 将身份转换为输入类型operator <<
  4. 这些转换序列都具有相同的排名。因此,呼叫应该是模糊的。如果不是,对我来说这是一个编译器错误。