簡體   English   中英

復制構造函數中const_cast的含義?

[英]Implications of a const_cast in a copy constructor?

因此,我有一個輸出流類,該類具有一個指向實際執行寫操作的類的指針,並且我需要一個復制構造函數,以便可以從函數中返回初始化的實例,以便可以將某些值透明地綁定到用戶。 為了具有合理的復制語義,我真的很想清除復制對象中的writer指針,並關閉它,使其在復制期間不可用。

我可以使用非常量副本構造函數a-la做到這一點:

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

但是我希望能夠直接從函數調用返回的臨時值中進行分配:

Test test = make_test();

復制構造函數必須為const。 所以我很好奇在復制構造函數中使用const_cast的含義。 我將其他引用轉換為非const指針,並清除了我提到的writer指針。 我知道const_cast通常被認為是邪惡的,但在這種情況下可以工作嗎? 我特別好奇它將如何與從函數調用返回的臨時對象進行交互。

另外,我真的只希望訪問四個創建函數,如果有合理的方法來限制它的范圍,以便僅對那些函數(包括它們的返回值)可用,那么我會更喜歡。

聽起來像是可變的工作:

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;
}

通過使const copy構造函數具有破壞性,您將違反對象的公共合同和任何客戶端代碼的期望。

除此之外,刪除參數的常數性沒有問題。

您可能希望看看std::auto_ptr的實現,因為其復制構造函數還會使原始對象發生變化。

但是請注意,這種語義正是為什么許多人不喜歡std::auto_ptr

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM