クラス C に静的 unordered_map があります。関数 main を含むファイルとは別のファイルにクラス定義と宣言を配置すると、動作に違いが生じます。
問題は、クラス C が関数 main と同じコンパイル単位にある場合、すべて問題なく、「新しい文字列が作成されました: c」というテキストが 1 回だけ表示されることです。ただし、コードを 3 つのファイルに分割すると (以下のリストを参照)、「新しい文字列が作成されました: c」が 2 回表示されます。これは、静的な unordered_map が main に入る直前に消去されることを意味します。
私の質問は次のとおりです。なぜこれが起こるのですか?(違いは、Apple LLVM コンパイラ 4.1 でコンパイルした場合にのみ発生します。 g++4.7 -std=c++11 でテストしたところ、分割コードは問題なく動作しました。)
アイデアをお寄せいただきありがとうございます。
// would go to My_header.h
#include <unordered_map>
#include <string>
#include <iostream>
using namespace std;
class C{
public:
C(const string & s);
private:
static unordered_map<string, string*> m;
string *name;
};
// would go to My_code.cpp
// (when separated, add #include "My_header.h")
unordered_map<string, string*> C::m;
C::C(const string & s):
name(NULL)
{
string*& rs = m[s];
if(rs)
{
name = rs;
}
else
{
cout<<"new string created: "<<s<<endl;
rs = name = new string(s);
}
}
// would go to main.cpp
// (when separated, add #include "My_header.h")
C c("c");
int main(int argc, const char * argv[])
{
cout << "main" << endl;
C c1("c");
}