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

acr*_*075 13 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;
}
Run Code Online (Sandbox Code Playgroud)

相反,只要定义了一个数字强制转换运算符,它就会编译没有错误,没有警告,并且优先使用数字强制转换operator const char *().声明的运算符的顺序没有区别.

然而,如果operator int()operator float()都定义,那么我得到了我从一开始就预计:

'operator <<'含糊不清

是否有强制转换的优先规则,或者为什么编译器默认选择数值转换?我明白我应该明确说明我的意思,但我的问题是关于编译器的默认选择.


编辑:使用编译器MSVC 2010

And*_*owl 4

转换根据 C++ 标准的 \xc2\xa7 13.3.3.1 进行排名。特别是,与您的示例相关的用户定义的转换序列由 \xc2\xa7 13.3.3.1.2/1 监管:

\n\n

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

\n\n

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

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

这些转换序列都具有相同的等级。因此,调用应该是不明确的。如果不是,对我来说这是一个编译器错误。

\n