直接初始化与值初始化
Direct Initialization vs. Value Initialization
我是一名试图学习 C++11 的 C 程序员,但我 运行 遇到了一些我不理解的事情。据我所知,以下问题是值初始化和直接初始化之间的区别。
以下代码片段无法使用 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;
}
它给了我:
error C2797: 'TestClass::_msg': list initialization inside member initializer list or non-static data member initializer is not implemented
但是,改变
TestClass::TestClass(int val, std::string msg)
: _val{val}, _msg{msg}
至
TestClass::TestClass(int val, std::string msg)
: _val{val}, _msg(msg)
解决了我的问题。这两种初始化形式有什么区别,什么时候应该使用其中一种?我被引导相信在处理显式类型时我应该使用值初始化。
这是 Visual C++ 编译器的实现细节。您可以阅读有关此错误的更多信息 here。页面状态:
The C++ compiler in Visual Studio does not implement list initialization inside either a member initializer list or a non-static data member initializer
您的代码试图实现第一种情况。您提出的解决方案解决了这个问题,但如果您仍然更喜欢在构造函数中以某种方式使用初始化列表,您可以这样做:
TestClass::TestClass(int val, std::string msg)
: _val{val}, _msg(std::string{msg})
哪个会如您所愿。
我是一名试图学习 C++11 的 C 程序员,但我 运行 遇到了一些我不理解的事情。据我所知,以下问题是值初始化和直接初始化之间的区别。
以下代码片段无法使用 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;
}
它给了我:
error C2797: 'TestClass::_msg': list initialization inside member initializer list or non-static data member initializer is not implemented
但是,改变
TestClass::TestClass(int val, std::string msg)
: _val{val}, _msg{msg}
至
TestClass::TestClass(int val, std::string msg)
: _val{val}, _msg(msg)
解决了我的问题。这两种初始化形式有什么区别,什么时候应该使用其中一种?我被引导相信在处理显式类型时我应该使用值初始化。
这是 Visual C++ 编译器的实现细节。您可以阅读有关此错误的更多信息 here。页面状态:
The C++ compiler in Visual Studio does not implement list initialization inside either a member initializer list or a non-static data member initializer
您的代码试图实现第一种情况。您提出的解决方案解决了这个问题,但如果您仍然更喜欢在构造函数中以某种方式使用初始化列表,您可以这样做:
TestClass::TestClass(int val, std::string msg)
: _val{val}, _msg(std::string{msg})
哪个会如您所愿。