簡體   English   中英

具有引用成員的賦值運算符

[英]Assignment operator with reference members

這是創建具有引用成員的賦值運算符的有效方法嗎?

#include <new>

struct A
{
    int &ref;
    A(int &Ref) : ref(Ref) { }
    A(const A &second) : ref(second.ref) { }
    A &operator =(const A &second)
    {
        if(this == &second)
            return *this;
        this->~A();
        new(this) A(second);
        return *this;
    }
}

它似乎編譯和運行良好,但是 C++ 傾向於在最不期望的情況下顯示未定義的行為,並且所有的人都說這是不可能的,我認為我錯過了一些問題。 我錯過了什么嗎?

它在語法上是正確的。 但是,如果放置 new 拋出,您最終會得到一個無法破壞的對象。 如果有人從您的班級派生,則更不用說災難了。 只是不要這樣做。

解決方法很簡單:如果類需要支持賦值,不要使用任何引用成員。 我有很多類接受引用參數,但將它們存儲為指針,以便該類可以支持賦值。 就像是:

struct A
{
    int* myRef;
    A( int& ref ) : myRef( &ref ) {}
    // ...
};

另一種解決方案是使用 reference_wrapper 類(在功能標頭中):

struct A
{
    A(int& a) : a_(a) {}
    A(const A& a) : a_(a.a_) {}

    A& operator=(const A& a)
    {
        a_ = a.a_;
        return *this;
    }

    void inc() const
    {
        ++a_;
    }

    std::reference_wrapper<int>a_;

};

據我所知,你所做的在技術上是正確的,但它會產生麻煩。 例如,考慮從A派生的類會發生什么,因為它的賦值運算符生成一個新對象(切片)。 您不能將引用轉換為類中的指針嗎?

除此之外,復制構造函數和賦值運算符通常通過const&獲取其參數。

您所做的是正確的,但它不是編寫復制賦值運算符的非常安全的方法。 此外,您應該考慮使用指針成員而不是引用成員。

您應該使用Copy and Swap Idiom來實現它。 與您的實施相比,它至少有 3 個優勢。

暫無
暫無

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

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