0

私はいくつかのレガシーコードをトレースしています.Singletonクラスの.cppファイルの下にこれを見つけました.

namespace
{
    bool forceInit = (CFoo::getInstance(), true);
}

このコードの意味は何ですか? これはシングルトン クラスの強制初期化ですか? なぜコードが存在するのですか?

ありがとう

4

1 に答える 1

5

次のコードを考えてみましょう (: C++11 コード!):

#include <iostream>

struct Singleton
{
  Singleton()
  {
    std::cout << "init singleton" << std::endl;
  }

public:
  static Singleton& Instance()
  {
    static Singleton instance;
    return instance;
  }
};

namespace
{
  bool forceInit = (Singleton::Instance(), true);
}

int main()
{
  std::cout << "enter main" << std::endl;
  return 0;
}

効果は次のとおりです。forceInitが初期化され、Singleton::Instance()呼び出されると、非constref が破棄forceInitされ、true に設定されます。これが発生する理由は、名前空間レベルの変数が に入る前に静的に初期化されるためmain()です。

問題は、これを簡単に行うことができないことです:

namespace
{
  Singleton::Instance();
}

これを行うことができます:

namespace
{
  Singleton& singRef = Singleton::Instance();
}

ただし、作者はシングルトンへの実際の参照を翻訳単位に入れたくなかったと思います。Instance()コンマ演算子を使用すると、シングルトンの静的インスタンスへの参照を実際に初期化せずに呼び出すことができます。

編集:これを行う具体的な理由については、コメントがない場合、作者が意図したことを知っているのは作者だけである可能性があります。

EDIT2:ああ、ところで、上記のプログラムは印刷します

init singleton
enter main

...予想通り。

于 2013-10-18T13:44:02.883 に答える