2017-08-29 3 views
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の初期化はコンストラクタ初期化子リストに移動すると、エラーが消えます。

これはコンパイラのバグか、宣言に何か問題がありますか?

+3

VS2013ではC++ 11の機能セットと実装が不完全であるため、コンパイラのバグになる可能性が非常に高いです。 VS2015にアップグレードしてみてください(VS2017はなぜですか?) –

答えて

1

VS2015でコードをビルドしようとしましたが、デバッグビルドで正常に動作します。私はこの出力を得た:

Start... 
Ctor 
Complete... 

"クラッシュ"なし。

VS2013のコンパイラのバグかもしれません。新しいC++コンパイラにアップグレードすることができます。

関連する問題