14

在下面的代码中,如果由于歧义而定义了多个强制转换运算符,我预计会出现编译器错误。

#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()都定义了,那么我从一开始就得到了我的期望:

'operator <<' 不明确

转换是否有优先规则,或者为什么编译器默认选择数字转换?我确实明白我应该明确说明我的意思是哪个演员,但我的问题是编译器做出的默认选择。


编辑:使用编译器 MSVC 2010

4

1 回答 1

4

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

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

这里的所有转换序列都涉及:

  1. 对转换函数的隐式对象参数的源类型的虚构转换;
  2. 用户定义的转换;
  3. 到输入类型的身份转换operator <<

These conversion sequences all have the same rank. Thus, the call should be ambiguous. If it is not, for me it is a compiler bug.

于 2013-01-16T14:25:32.860 回答