我是一名C程序员,正在尝试学习C ++ 11,而且我遇到了一些我不理解的事情。据我所知,以下问题是值初始化和直接初始化之间的区别。
以下代码段无法使用Visual Studio进行编译:
class TestClass {
int _val;
std::string _msg;
public:
TestClass(int, std::string);
void action();
};
TestClass::TestClass(int val, std::string msg)
: _val{val}, _msg{msg}
{
}
void TestClass::action()
{
std::cout << _msg << _val << std::endl;
}
它给了我:
错误C2797:&#39; TestClass :: _ msg&#39;:成员初始化列表或非静态数据成员初始化程序内的列表初始化未实现
然而,改变
TestClass::TestClass(int val, std::string msg)
: _val{val}, _msg{msg}
到
TestClass::TestClass(int val, std::string msg)
: _val{val}, _msg(msg)
解决了我的问题。这两种初始化形式之间有什么区别,何时应该使用另一种形式?我曾经相信我应该在处理显式类型时使用值初始化。
答案 0 :(得分:3)
这是Visual C ++编译器的实现细节。您可以阅读有关此错误的更多信息here。页面说明:
Visual Studio中的C ++编译器未在成员初始值设定项列表或非静态数据成员初始值设定项中实现列表初始化
您的代码尝试实现第一种情况。您提出的解决方案可以解决此问题,但如果您仍然希望在构造函数中以某种方式使用初始化列表,则可以执行此操作:
TestClass::TestClass(int val, std::string msg)
: _val{val}, _msg(std::string{msg})
哪个会按你的意愿运作。