[英]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.