4
#include <functional>
#include <map>
#include <string>
#include <iostream>
class X
{
public:
X()
{
std::cout << "Ctor\n";
}
private:
typedef std::map<std::string, std::function<void()>> ValidatorType;
const ValidatorType m_validators = ValidatorType
{
{
"some-string",
[]()
{
// validation code
std::cout << "Validating...\n";
}
}
};
};
int main()
{
std::cout << "Start...\n";
X x;
std::cout << "Complete...\n";
return 0;
}
上記のコードは、Xcode 7.2.1およびClang 7.0.2を使用してOS Xでデバッグおよびリリースモードで正常にビルドされ、実行されます。クラス宣言でconstメンバー変数が初期化されたときの例外
また、Windowsデスクトップ用のVisual Studio Express 2013を使用して、Windows 7でリリースモードで正常に構築され、正常に実行されます。
ただし、Windowsのデバッグモードで実行するとクラッシュします。コンストラクタが実行を終了する前にアクセス違反が発生します。次のようにコンソール出力は次のようになります。
Start...
Ctor
m_validators
の初期化はコンストラクタ初期化子リストに移動すると、エラーが消えます。
これはコンパイラのバグか、宣言に何か問題がありますか?
VS2013ではC++ 11の機能セットと実装が不完全であるため、コンパイラのバグになる可能性が非常に高いです。 VS2015にアップグレードしてみてください(VS2017はなぜですか?) –