[英]Why user-defined conversion is not implicitly taking place on the calling object
考虑以下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
在上面的代码中,转换操作符是通过名为cast的static_cast
隐式调用的。
请注意, B
中的转换运算符未指定为explicit
,以便也允许隐式转换。 但是,以下代码无法编译:
B b;
b.func(); // <-- error: 'class B' has no member named 'func'
就像错误消息所说的那样,类B
没有名为func
成员,但是类A
,而类B
的用户定义的转换运算符是A
在这种情况下, 不会隐式调用用户定义的转换运算符。
为什么没有隐式完成转换?
成员访问不考虑转换(第5.2.5 / 2节[expr.ref])。
在任何一种情况下, id表达式均应命名该类或其基类之一的成员
这里的id表达式是func()
因此,编译器认为func
必须是B
的成员或B
派生的类。 不考虑隐式转换为可能具有func
成员的其他类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.