5

在下面的例子中,应该调用哪个转换函数?为什么要选择那个而不是另一个?

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

A x;
int i = x + 1;

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

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

来自 [expr.add]

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

来自 [转化]

具有给定类型的表达式将在几个上下文中隐式转换为其他类型:

  • 用作运算符的操作数时。操作员对其操作数的要求决定了目标类型
4

1 回答 1

9

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

对于每个 cv-qualified 或 cv-unqualified 对象类型 T 存在以下形式的候选运算符函数

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

[...]

由于1有 type ,编译器认为int内置s 作为更好的选择,因为它只需要对第一个参数进行(用户定义的)转换。operator +int

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

int i = x + static_cast<std::ptrdiff_t>(1); // AMBIGUOUS!

这是一个活生生的例子

于 2013-07-15T22:54:38.733 回答