如果加法表达式的第一个操作数可以转换为指针和整数,那么选择哪个转换?

时间:2013-07-15 22:38:55

标签: c++ type-conversion overloading language-lawyer implicit-conversion

在以下示例中,应调用哪个转换函数?为什么要选择那个呢?

struct A
{
  operator int();
  operator int*();
};

A x;
int i = x + 1;

编译器选择operator int() ..但为什么?

以下是C ++ 03中的一些相关引用:

来自[expr.add]

  

另外,两个操作数都应具有算术或枚举类型,或者一个操作数应是指向完全定义的对象类型的指针,另一个操作数应具有整数或枚举类型。

来自[conv]

  具有给定类型的

表达式将在多个上下文中隐式转换为其他类型:

     
      
  • 用作运营商的操作数。运营商对其操作数的要求决定了目的地类型
  •   

1 个答案:

答案 0 :(得分:9)

此行为的原因是接受指针作为其左手操作数的内置运算符接受类型为std::ptrdiff_t的对象作为其右手操作数。这在C ++ 11标准的第13.6节中规定:

  

对于每个cv-qualified或cv-nonqualified对象类型T,都存在表单的候选运算符函数

T * operator+(T *, std::ptrdiff_t);
     

[...]

由于1的类型为int,编译器会将内置operator +视为更好的选择,因为它只需要一个({1}} -defined)第一个参数的转换。

如果您提供int类型的参数作为std::ptrdiff_t的右手操作数,您会看到预期的歧义:

operator +

这是live example