2017-08-29 40 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++编译器。

相关问题