這是代碼:
class SomeType {
public:
SomeType() {}
~SomeType() {}
std::string xxx;
}
bool funtion_ab() {
SomeType(); // This is a right val;
// The right val destructs here when I test the code. I want to make sure that it would always destructs here.
int a = 0, b = 10;
....// other code
return true;
}
如果你知道真相,請告訴我。謝謝!
uj5u.com熱心網友回復:
你所擁有的稱為臨時物件。從§6.7.7開始,
臨時物件被創建
- 當 prvalue 轉換為 xvalue
或者,更具體地說,
[注3:臨時物件物化:
...
- 當具有非 cv void 型別的純右值顯示為丟棄值運算式 ( [expr.context] ) 時。
——尾注]
而且,在一生中,同一部分有這樣的話
臨時物件作為評估完整運算式 ( [intro.execution] ) 的最后一步被銷毀,該運算式(在詞法上)包含它們的創建點。
您可以閱讀有關運算式語意的更多資訊,但在您的情況下,“完整運算式”是相當明確的。
SomeType();
包含建構式呼叫的“完整運算式”是……建構式呼叫本身。所以解構式將在評估建構式后立即被呼叫。此規則有一些例外情況(例如,如果臨時物件作為例外拋出或作為參考系結),但這些都不適用于此處。
正如評論中所指出的,編譯器可以自由地行內您的建構式和解構式呼叫,然后可以自由地注意到它們什么都不做并完全省略它們。優化器可以對您的代碼做一些有趣的事情,前提是它不會改變語意。但是嚴格閱讀標準表明解構式正是在您建議的位置呼叫的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/533814.html
標籤:C 11
