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 <<'含糊不清
是否有强制转换的优先规则,或者为什么编译器默认选择数值转换?我明白我应该明确说明我的意思,但我的问题是关于编译器的默认选择.
转换根据 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\noperator <<。这些转换序列都具有相同的等级。因此,调用应该是不明确的。如果不是,对我来说这是一个编译器错误。
\n| 归档时间: |
|
| 查看次数: |
312 次 |
| 最近记录: |