繁体   English   中英

为什么没有在调用对象上隐式进行用户定义的转换

[英]Why user-defined conversion is not implicitly taking place on the calling object

考虑以下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

在上面的代码中,转换操作符是通过名为caststatic_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM