繁体   English   中英

C++ 构造函数初始化列表“错误:预期的'('或'{'”

[英]C++ constructor initializer list “ error: expected '(' or '{'”

这不编译:

class foo
{
  struct node
  {
    wchar_t val;
    unordered_map<wchar_t,unique_ptr<node>> children;
  };

  node root;

public:

  foo() : 
    root.val(L'า'), // error: expected '(' or '}'
    root.children(unordered_map<wchar_t, unique_ptr<node>>())
    {}; // error: expected '(' or '}'
};

但这确实:

class foo
{
...<same as above> ....

    foo() : root{L'า', unordered_map<wchar_t, unique_ptr<node>>()}{};
};

请赐教,为什么我不能像前者那样表达? 我找了一个多小时,找不到解释。 我确定我忽略了一些简单的事情。

clang 版本 9.0.0 (tags/RELEASE_900/final) 目标:x86_64-apple-darwin17.7.0 clang++ -std=c++17

谢谢!

因为你就是做不到。

构造函数的成员初始化器用于初始化成员。 未选择成员的成员。 就这么简单。 没有功能可以做你想做的事。

C++ 标准能提供这样的东西吗? 可能。 但总的来说,它会打开各种令人讨厌的边缘情况,包括半初始化对象、不明确的语义和异常安全噩梦。 (如果存在更多, root object 的 rest 会发生什么情况?如何初始化 object 本身?部分?全部?什么时候?)

一切都是为了绝对没有任何收获。

传递调用构造函数使初始化保持简单、清晰,并且始终由代码中相应的 object“拥有”。

使用成员自己的初始化功能,就像您在第二个示例中一样。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM