const_cast在复制构造函数中的含义?

时间:2010-07-04 03:10:49

标签: c++ const-cast

所以我有一个输出流类,它拥有一个实际执行写操作的类的指针,我需要一个复制构造函数,以便我可以从函数返回初始化实例,这样我就可以透明地绑定某些值用户。为了获得合理的复制语义,我真的想清除复制对象中的writer指针并关闭它,使其在复制期间无法使用。

我可以使用非const复制构造函数a-la:

来做到这一点
class Test {
  public:
    Test(Test& other);
};

但我希望能够直接从函数调用返回的临时值中分配:

Test test = make_test();

复制构造函数必须是const。所以我很好奇在复制构造函数中使用const_cast的含义是什么。我将另一个引用转换为非const指针并清除我提到的writer指针。我知道const_cast通常被认为是邪恶但在这种情况下它可以工作吗?我特别好奇它将如何与函数调用返回的临时对象进行交互。

或者只有四个创建函数,我真的想要访问复制构造函数,如果有一个合理的方法来限定它,使它只能用于那些函数(包括它们的返回值)然后我会更喜欢。

3 个答案:

答案 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的原因。