【发布时间】:2015-07-11 23:56:33
【问题描述】:
我是一名尝试学习 C++11 的 C 程序员,但遇到了一些我不明白的事情。据我所知,以下问题是值初始化和直接初始化之间的区别。
以下代码 sn-p 无法使用 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::_msg”:未实现成员初始化器列表或非静态数据成员初始化器内的列表初始化
然而,改变
TestClass::TestClass(int val, std::string msg)
: _val{val}, _msg{msg}
到
TestClass::TestClass(int val, std::string msg)
: _val{val}, _msg(msg)
解决了我的问题。这两种初始化形式有什么区别,什么时候应该使用另一种?我被引导相信在处理显式类型时我应该使用值初始化。
【问题讨论】:
-
您的第一个示例没有任何问题。你的编译器是错误的。你用的是什么版本? 编辑 从头开始。错误消息显示“未实施”。所以编译器作者已经意识到了这个问题,只是他们还没有在你使用的版本中修复它。
-
_msg{msg}和_msg(msg)都是 direct initialization。区别在于前者是direct-list-initialization,而后者是直接非列表初始化。 -
奇怪的是,我发现 mingw-w64 上的 gcc-4.9 与 Linux 上的相同版本之间存在类似的差异。哇。对我来说,这是 std::array 成员的初始化。
标签: c++ c++11 initialization value-initialization