2016-09-08 7 views
4

デフォルトの引数値として静的データメンバーを使用する場合、static initialization order fiascoについて心配する必要はありますか?たとえば:静的データメンバーはC++のデフォルト引数として安全ですか?

class Thing { 

    static double const default_blarg; // initialized in another file 

    void run(double blarg=default_blarg); 

}; 

私はrunにデフォルト引数が初期化されるときdefault_blargは、リンク時に、主に、不特定の時点で初期化されますが、私はわからない知っています。 default_blargが初期化される前のある時点で、クラス・インタフェースの一部としてデフォルト値を安全に公開するために、どのような方法を使用すればよいでしょうか?静的データメンバーにconstexprを使用すると安全ですか?

default_blargがconstでない(これが理由です)場合、これは非常に混乱する挙動を引き起こす可能性があることに注意してください。また、非静的なデータメンバーを使用しようとしていません。

答えて

4

まだ静的な初期化順序の失敗を心配する必要があります。 a.cppとb.cppがあるとします。 a.cppであなたが今

double const Thing::default_blarg = 0; 

を持ってa.cppにこのポイントの後runへの呼び出しが初期化され、デフォルトを持って、あなたが行ってもいいです。残念なことにb.cppには、Thingのインスタンスを作成し、runを呼び出す別の静的オブジェクトがあります。

今は何が起こるかわかりません。 b.cppが最初に実行される場合、default_blargは初期化されておらず、未定義の動作をします。あなたのために今

第二部

が、私は実行するために、デフォルトの引数は、関数のデフォルト引数は、関数が呼び出されるたびに評価されている

に初期化されるときにはよく分かりません。したがって、関数がdefault_blargが初期化された後に呼び出されている限り(上記のように)、あなたは大丈夫です。

2

C++ 11規格、セクション8.3.6/9から:

デフォルト引数が関数が呼び出されるたびに評価されています。 Thing::runが呼び出される前に

は限りThing::default_blargが初期化されているとして、あなたは、予測可能な動作が表示されるはずです。

関連する問題