为什么用户定义的转换不会在调用对象上隐式发生
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
在上面的代码中,转换运算符通过名为 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
成员的其他类型的类型。
相关文章:
- 对RValue对象调用的LValue ref限定成员函数
- 检查哪个对象调用了另一个对象的对象方法
- 在 C++ 的 Switch Case 中创建对象后对对象调用方法
- 从 Base 引用对象调用派生类的成员
- 为什么为未删除的对象调用析构函数?
- Qt c++不会为所有对象调用move_slot.为什么?
- 使用在堆栈上创建的对象调用虚拟函数
- 使用基类对象调用Dervied Class函数
- C++:允许临时对象调用非常量成员函数的设计理念是什么?
- 从类中的对象调用类中的函数的最佳方法
- 派生对象调用的 Base 方法的模板推导
- 如何使用单个对象调用具有相同名称的两个类函数
- 是否可以从另一个类对象调用一个类函数而不继承第一个类
- 如果类没有任何成员变量,则通过临时对象调用类的成员函数的开销是多少?
- 如何对动态数组中的某些对象调用析构函数
- 如何从列表中存储的对象调用成员函数
- 从线程内的对象调用静态方法
- 从成员对象调用方法
- 当包含它的对象调用其析构函数时,unique_ptr是否未分配
- 从对象调用成员对象,错误:引用非常量值的初始值必须是左值