所以我有一个输出流类,它拥有一个实际执行写操作的类的指针,我需要一个复制构造函数,以便我可以从函数返回初始化实例,这样我就可以透明地绑定某些值用户。为了获得合理的复制语义,我真的想清除复制对象中的writer指针并关闭它,使其在复制期间无法使用。
我可以使用非const复制构造函数a-la:
来做到这一点class Test {
public:
Test(Test& other);
};
但我希望能够直接从函数调用返回的临时值中分配:
Test test = make_test();
复制构造函数必须是const。所以我很好奇在复制构造函数中使用const_cast的含义是什么。我将另一个引用转换为非const指针并清除我提到的writer指针。我知道const_cast通常被认为是邪恶但在这种情况下它可以工作吗?我特别好奇它将如何与函数调用返回的临时对象进行交互。
或者只有四个创建函数,我真的想要访问复制构造函数,如果有一个合理的方法来限定它,使它只能用于那些函数(包括它们的返回值)然后我会更喜欢。
答案 0 :(得分:3)
听起来像是一个可变的工作:
struct A {
A() : x(0) {}
A( const A & a ) : x( a.x ) {
a.x = 0;
}
mutable int x;
};
int main() {
A a1;
A a2 = a1;
}
答案 1 :(得分:2)
通过使const复制构造函数具有破坏性,您将违反对象的公共合同以及任何客户端代码的期望。
除此之外,删除参数的常量没有问题。
答案 2 :(得分:1)
您可能希望查看std::auto_ptr
的实现,因为它的复制构造函数也会改变原始对象。
但请注意,这种语义正是很多人不喜欢std::auto_ptr
的原因。