1

这不编译:

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

谢谢!

4

1 回答 1

0

因为你就是做不到。

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

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

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

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

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

于 2020-04-15T13:35:44.587 回答