[英]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.