【问题标题】:Direct Initialization vs. Value Initialization直接初始化与值初始化
【发布时间】: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


【解决方案1】:

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

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

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

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

这将按您的意愿工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多