代码之家  ›  专栏  ›  技术社区  ›  gct

复制构造函数中常量强制转换的含义?

  •  0
  • gct  · 技术社区  · 15 年前

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

    我可以用一个非const-copy构造函数,a-la:

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

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

    Test test = make_test();
    

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

    另外,只有四个创建函数是我真正想要访问复制构造函数的,如果有一个合理的方法来限定它,使它只对那些函数(包括它们的返回值)可用,那么我更喜欢这样。

    3 回复  |  直到 15 年前
        1
  •  2
  •   Franci Penov    15 年前

    通过使const-copy构造函数具有破坏性,您将违反对象的公共契约和任何客户机代码的期望。

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

        2
  •  3
  •   anon    15 年前

    听起来像是易变的工作:

    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;
    }
    
        3
  •  1
  •   jamesdlin    15 年前

    你可能想看看 std::auto_ptr 作为其复制构造函数的实现也会改变原始对象。

    但要知道,这种语义正是很多人不喜欢的原因 STD:AutoTypTR .