直接初始化与值初始化
问题描述:
我是一名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: 'TestClass中:: _味精':内部成员初始化列表或非列表初始化 - 不执行静态数据成员初始值设定程序
但是,更改
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。该页面的状态:
C++编译器在Visual Studio中没有实现任何一个成员初始化列表或一个非静态数据成员初始化
你的代码试图实现第一种情况的内部列表初始化。你提出的解决方案解决了这个问题,但如果你还是喜欢在构造函数中以某种方式使用初始化列表,你可以这样做:
TestClass::TestClass(int val, std::string msg)
: _val{val}, _msg(std::string{msg})
,你打算这将正常工作。
你的第一个例子没有错。你的编译器是错误的。你使用什么版本? **编辑**从头开始。错误消息显示“未执行”。所以编译器作者意识到这个问题,他们只是没有在你使用的版本中修复它。 –
http://en.cppreference.com/w/cpp/language/list_initialization – 0x499602D2
'_msg {msg}'和'_msg(msg)'都是[直接初始化](http://en.cppreference.com/w/CPP /语言/ direct_initialization)。不同之处在于前者是[direct-list-initialization](http://en.cppreference.com/w/cpp/language/list_initialization),而后者则是直接非列表初始化。 – cpplearner