考虑A
和B
的以下类定义:
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
。在这种情况下,用户定义的转换运算符不隐式调用。
为什么转换没有隐式完成?
答案 0 :(得分:5)
成员访问不考虑转换(§5.2.5/ 2 [expr.ref])。
无论哪种情况, id-expression 应该命名该类或其基类之一的成员
此处 id-expression 为func()
因此,编译器认为func
必须是B
的成员或B
派生的类。不考虑隐式转换为可能具有func
成员的其他类型。