0

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

我可以使用非常量复制构造函数 a-la 来做到这一点:

class Test {
  public:
    Test(Test& other);
};

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

Test test = make_test();

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

或者,只有四个创建函数我真的想访问复制构造函数,如果有一种合理的方法来确定它的范围,以便它只能用于这些函数(包括它们的返回值),那么我更喜欢那个。

4

3 回答 3

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;
}
于 2010-07-04T09:31:06.243 回答
2

通过使您的 const 复制构造函数具有破坏性,您将违反对象的公共合同和任何客户端代码的期望。

除此之外,删除参数的常量没有问题。

于 2010-07-04T03:18:24.163 回答
1

您可能希望查看std::auto_ptr's 的实现,因为它的复制构造函数也会改变原始对象。

但请注意,这种语义正是很多人不喜欢的原因std::auto_ptr

于 2010-07-04T09:24:10.203 回答