2017-08-29 71 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; 
} 

上述代碼在OS X上使用Xcode 7.2.1和Clang 7.0.2在調試和發佈模式下成功構建和運行。當在類聲明中初始化const成員變量時在調試模式下出現異常

它還使用Visual Studio Express 2013 for Windows Desktop在Windows 7上以發佈模式成功構建和運行。

但是,它在Windows上以調試模式運行時會崩潰。在構造函數完成執行之前發生訪問衝突。控制檯輸出如下:

Start... 
Ctor 

如果m_validators初始化移動到初始化器列表,然後錯誤消失的構造函數。

這可能是一個編譯器錯誤或者是否有錯誤的聲明?

+3

VS2013中的C++ 11功能集和實現不完整,所以很可能是編譯器錯誤。嘗試升級到VS2015(或爲什麼不VS2017?),並看到它效果更好。 –

回答

1

我試着用VS2015構建代碼,它在調試版本中運行良好。我得到這個輸出:

Start... 
Ctor 
Complete... 

沒有任何「崩潰」。

它可能是VS2013的編譯器錯誤。您可能需要升級到新的C++編譯器。