wil*_*llj 5 c++ overloading type-conversion language-lawyer implicit-conversion
在以下示例中,应调用哪个转换函数?为什么要选择那个呢?
struct A
{
operator int();
operator int*();
};
A x;
int i = x + 1;
Run Code Online (Sandbox Code Playgroud)
编译器选择operator int()..但为什么?
以下是来自C++ 03的一些相关引用:
来自[expr.add]
另外,两个操作数都应具有算术或枚举类型,或者一个操作数应是指向完全定义的对象类型的指针,另一个操作数应具有整数或枚举类型.
来自[转]
具有给定类型的表达式将在多个上下文中隐式转换为其他类型:
- 用作运算符的操作数时.运营商对其操作数的要求决定了目的地类型
这种行为的原因是接受指针作为其左手操作数的内置运算符接受类型的对象std::ptrdiff_t作为其右手操作数.这在C++ 11标准的第13.6节中规定:
对于每个cv限定或cv非限定对象类型T,存在表单的候选运算符函数
Run Code Online (Sandbox Code Playgroud)T * operator+(T *, std::ptrdiff_t);[...]
由于1具有类型int,编译器会将内置operator +两个ints视为更好的选择,因为它只需要对第一个参数进行(用户定义的)转换.
如果你提供了一个类型的参数std::ptrdiff_t作为右手操作数operator +,你会看到预期的歧义:
int i = x + static_cast<std::ptrdiff_t>(1); // AMBIGUOUS!
Run Code Online (Sandbox Code Playgroud)
这是一个实例.