2017-06-26 3 views
3

使用されていない内部リンケージをグローバルに持つ場合、イニシャライザの動作は保証されていますか?たとえば:未使用のグローバルの静的イニシャライザ

static int x = SideEffectfulFunction(); 

または

namespace { 
    int x = SideEffectfulFunction(); 
} 

xが参照されない場合であっても、呼び出されることが保証SideEffectfulFunction()ですか?またはxが削除されるのは正当ですか?

答えて

9

はい、標準保証この

静的記憶期間[basic.stc.static]

2静的記憶寿命変数が初期化または副作用とデストラクタがある場合、それをクラスオブジェクトまたはそのコピー/ムーブが15.8で指定されているように排除される場合を除き、未使用のように見えても削除されてはならない。

+1

秒1ナノ:) +1によって私ビート。 – StoryTeller

+0

@StoryTellerはあなたに話して以来、このような質問の標準を読んでいました:) – Curious

+1

me2 :) +1 .......... – mattideluxe

0

これは保証されています。異なるソースファイル内で互いに参照する複数の静的オブジェクトを作成している場合は、オブジェクトがどのような順序で初期化されるかは保証されません。これはstatic initialization order fiascoと呼ばれ、静的オブジェクトを作成する関数、初期化の順序がファンクションオブジェクトであることを確認し、次にセカンダリオブジェクトを確認します。

出典: https://isocpp.org/wiki/faq/ctors#static-init-order

関連する問題