2015-07-11 274 views
2

我是一名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) 

修复我的问题。这两种形式的初始化有什么区别,什么时候应该使用另一种形式?我被引导认为在处理显式类型时应该使用值初始化。

+1

你的第一个例子没有错。你的编译器是错误的。你使用什么版本? **编辑**从头开始。错误消息显示“未执行”。所以编译器作者意识到这个问题,他们只是没有在你使用的版本中修复它。 –

+0

http://en.cppreference.com/w/cpp/language/list_initialization – 0x499602D2

+2

'_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

回答

3

这是Visual C++编译器的实现细节。你可以阅读更多关于这个错误here。该页面的状态:

C++编译器在Visual Studio中没有实现任何一个成员初始化列表或一个非静态数据成员初始化

你的代码试图实现第一种情况的内部列表初始化。你提出的解决方案解决了这个问题,但如果你还是喜欢在构造函数中以某种方式使用初始化列表,你可以这样做:

TestClass::TestClass(int val, std::string msg) 
    : _val{val}, _msg(std::string{msg}) 

,你打算这将正常工作。