在 class 声明中初始化 const 成员变量时调试模式下的异常
Exception in debug mode when const member variable initialised in class declaration
#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 上以调试和发布模式成功构建并 运行s。
它还在 Windows 7 上使用 Visual Studio Express 2013 for Windows Desktop 在发布模式下成功构建并 运行s。
但是,当 运行 在 Windows 上处于调试模式时它会崩溃。在构造函数完成执行之前发生访问冲突。控制台输出如下:
Start...
Ctor
如果 m_validators
的初始化被移动到构造函数初始化列表中,那么错误就会消失。
这可能是编译器错误还是声明有问题?
我尝试使用 VS2015 构建您的代码,它在调试构建中运行良好。我得到了这个输出:
Start...
Ctor
Complete...
没有任何 "crash".
这可能是 VS2013 的编译器错误。您可能想要升级到新的 C++ 编译器。
#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 上以调试和发布模式成功构建并 运行s。
它还在 Windows 7 上使用 Visual Studio Express 2013 for Windows Desktop 在发布模式下成功构建并 运行s。
但是,当 运行 在 Windows 上处于调试模式时它会崩溃。在构造函数完成执行之前发生访问冲突。控制台输出如下:
Start...
Ctor
如果 m_validators
的初始化被移动到构造函数初始化列表中,那么错误就会消失。
这可能是编译器错误还是声明有问题?
我尝试使用 VS2015 构建您的代码,它在调试构建中运行良好。我得到了这个输出:
Start...
Ctor
Complete...
没有任何 "crash".
这可能是 VS2013 的编译器错误。您可能想要升级到新的 C++ 编译器。