これを理解するのを手伝ってください... 太字を参照してください。標準 3.6.3 終了 (2) より
2 関数に、破棄された静的ストレージ期間またはスレッド ストレージ期間のブロック スコープ オブジェクトが含まれており、静的ストレージ期間またはスレッド ストレージ期間を持つオブジェクトの破棄中に関数が呼び出された場合、制御フローが通過する場合、プログラムは未定義の動作をします。以前に破棄されたブロックスコープ オブジェクトの定義。同様に、ブロック スコープ オブジェクトが破棄後に間接的に (つまり、ポインターを介して) 使用された場合の動作は未定義です。
Manager& GetManager()
{
static Manager localMan;
return localMan;
}
そしたらまたどこかで…
{
static User localUser;
localUser.DoSomething(); //localUser calls GetManager and uses the reference returned.
}
次に、ユーザーデストラクタで...
User::~User()
{
GetManager().DoSomethingOneLastTime();
}
//Now lets say Main exits and static destruction begins.
//Somehow localMan is destructed before User.
//Then user calls the GetManager() function in it's destructor.
//What case is this defined, and what case makes this undefined?
標準では、odr-use ルールで静的に作成されたローカルの static localMan オブジェクトが破棄され、関数が再度呼び出された場合 (新しい static を作成するかどうかにかかわらず)、これは未定義であると言っていますか? 定義された動作があるように見えますが、破壊されたオブジェクトの定義を通過する場合はそうではありません。
誰でもこれについて明確な洞察を持っていますか?