为什么用户定义的转换不会隐式发生在调用对象上

时间:2017-06-22 12:15:13

标签: c++ type-conversion implicit-conversion

考虑AB的以下类定义:

class A {
public:
   void func() const {}
};

class B {
public:
   // user-defined conversion operator to A
   operator A() const { return a_; }
private:
   A a_;
};

A定义了一个名为func()的公共成员函数。类B没有,但它确实将用户定义的转换运算符定义为类型A。这样,B的实例可以转换为 A的实例。以下代码按预期工作:

B b;
static_cast<A>(b).func(); // call func() on temporary instance of A

在上面的代码中,转换运算符是通过static_cast 命名的强制转换隐式调用的。

请注意,B中的转换运算符未指定为explicit,以便允许隐式转换。 但是,以下代码无法编译:

B b;
b.func(); // <-- error: 'class B' has no member named 'func'

正如错误消息所示,类B没有名为func的成员,但类A没有,类B确实有用户定义的转化运算符到A。在这种情况下,用户定义的转换运算符隐式调用。

为什么转换没有隐式完成?

1 个答案:

答案 0 :(得分:5)

成员访问不考虑转换(§5.2.5/ 2 [expr.ref])。

  

无论哪种情况,    id-expression 应该命名该类或其基类之一的成员

此处 id-expression func()

因此,编译器认为func必须是B的成员或B派生的类。不考虑隐式转换为可能具有func成员的其他类型。