2

我是一名尝试学习 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;
}

它给了我:

错误 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)

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

4

1 回答 1

3

这是 Visual C++ 编译器的实现细节。您可以在此处阅读有关此错误的更多信息。该页面指出:

Visual Studio 中的 C++ 编译器未在成员初始化程序列表或非静态数据成员初始化程序内实现列表初始化

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

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

这将按您的意愿工作。

于 2015-07-12T00:09:31.320 回答