【发布时间】:2020-11-15 23:10:18
【问题描述】:
我为转换和转换的复杂性而苦苦挣扎,我在网上找不到明确保证函数返回时有效转换的建议。我有两个类,Base 和 Derived,其中 Derived 在 Base 上没有额外的数据成员。我有一个用于基类的命名构造函数,我想使用 RVO 返回并以尽可能少的开销强制转换为派生类型的对象。
class Base {
public:
static Base namedConstructor(int n){
return Base(n);
}
protected:
Base(int n) : member(n){
}
int member;
};
class Derived : public Base {
static Derived nC2(int n) {
Derived derived = namedConstructor(n);
// Error: no suitable user-defined conversion from "Base" to "Derived"...
// modify derived
return derived;
}
};
有没有办法修复满足以下所有要求的错误?
- 不使用 RTTI。动态转换似乎没有必要。
- namedConstructor 的定义只有一个,以防我需要修改它。如有必要,我可以将其设为模板,但我对替代方案很感兴趣。
- namedConstructor 应该利用 nC2 中的 RVO。
- 如果我在基类或派生类中添加或删除数据成员,转换不应无声地失败(类似于 reinterpret_cast 的操作可能会这样做)。
【问题讨论】:
-
你不能像这样将一个对象转换成另一个对象。编译器需要知道如何从另一个创建一个。
Derived对象甚至无法构造,因为Base有一个私有构造函数。 -
我使构造函数受到保护。我不确定如何解决您的其他问题。当然不能这样转换和反对,有错误。
标签: c++ inheritance type-conversion return-value-optimization