對未初始化的數據使用賦值是否危險?使用賦值是危險的,因爲以前的值無效
使用賦值運算符時,何時應該格外小心?
我問的原因是因爲我在看視頻C++ and Beyond 2012: Andrei Alexandrescu - Systematic Error Handling in C++,他在那裏顯示Expected<T>
類,它有一個值或一個例外。此舉構造函數定義
Expected(Expected&& rhs) : .. {
if (gotHam) new(&ham) T(std::move(rhs.ham));
...
其中ham
被定義爲
union {
T ham;
std::exception_ptr spam;
};
他解釋背後使用新的佈局和resoning在28:49,他說,因爲他是用一個結合中,他有要格外小心地管理初始化。他在29:14則進一步指出:
因爲分配假設 前值是有效
我不明白這一點,我不能使用賦值 - 爲什麼會轉讓要求以前的值是有效的?我想這一點,比較的東西:
int i; // unassigned, i.e. not valid
i = 0; // so this would thus be dangerous?
我想,也許它已與工會做,而且類是未初始化的,但我仍然沒有看到轉讓的危害。爲什麼一項任務會關注以前的價值?
認爲T是一個管理內存的類,但構造函數從未執行過。 –
@RichardHodges好點 - 我的理解是,operator =會創建這些數據,類似於構造函數的操作。但我想運算符=可能會假設這些構造是由前面的構造函數創建的,因此跳過這一步。我在正確的軌道上嗎? :) – Default
聯盟不承擔任何責任。這只是記憶。如何初始化和使用該內存取決於您。這就是爲什麼Andrei的例子有一個標誌 - 告訴周圍代碼哪個成員是有效的。 –