我的理解是,具有靜態存盤持續時間的物件的銷毀順序與其初始化順序相反。
在此代碼片段中:
#include <iostream>
class LogValuesObj {
public:
LogValuesObj() {
std::cout << "LogValuesObj" << std::endl;
}
~LogValuesObj() {
std::cout << "~LogValuesObj" << std::endl;
}
};
void logValues() {
static LogValuesObj o;
std::cout << "logValues function called" << std::endl;
}
class EarlyInitLogValues {
public:
EarlyInitLogValues() {
std::cout << "EarlyInitLogValues" << std::endl;
logValues();
}
~EarlyInitLogValues() {
std::cout << "~EarlyInitLogValues" << std::endl;
}
};
EarlyInitLogValues e;
int main() {
return 0;
}
我的編譯器的輸出是:
EarlyInitLogValues
LogValuesObj
logValues function called
~EarlyInitLogValues
~LogValuesObj
在這種情況下,銷毀順序與 init 順序相同,我預計它會被顛倒。如果全域 'e' 和函式 static local 'o' 都有靜態存盤持續時間,為什么銷毀順序沒有顛倒?
uj5u.com熱心網友回復:
眾所周知,具有靜態存盤持續時間的物件以其構造的相反順序被銷毀。但更具體地說——因為這對你的情況很重要——它們以完成初始化的相反順序被銷毀。見[basic.start.term]/3。
在您的情況下, 的初始化o將在 的初始化之前完成e。因此,e在 之前被銷毀o。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/394779.html
標籤:C
