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

眠りネ*_*ネロク 2 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_;
};
Run Code Online (Sandbox Code Playgroud)

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

B b;
static_cast<A>(b).func(); // call func() on temporary instance of A
Run Code Online (Sandbox Code Playgroud)

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

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

B b;
b.func(); // <-- error: 'class B' has no member named 'func'
Run Code Online (Sandbox Code Playgroud)

正如错误消息所说,类B没有成员命名func,但类A没有,并且类B确实有一个用户定义的转换运算符A.在这种情况下,不会隐式调用用户定义的转换运算符.

为什么转换没有被隐含地完成?

And*_*dyG 5

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

在任何一种情况下,id-expression都应该命名该类或其一个基类的成员

这里的id表达式func()

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