在以下代码中
struct BinaryNode {
int val;
BinaryNode *leftchild, *rightchild;
};
struct NaryNode {
int val;
std::vector<NaryNode*> children;
};
我可以将第一个结构初始化为
std::unique_ptr<BinaryNode> bnode1(new BinaryNode{4});
但第二个失败
std::unique_ptr<NaryNode> nnode1(new NaryNode{4});
是什么给出了?
编辑:编译器错误是
tree.cpp: In function ‘int main()’:
tree.cpp:41:68: error: no matching function for call to ‘NaryNode::NaryNode(<brace-enclosed initializer list>)’
tree.cpp:41:68: note: candidates are:
tree.cpp:10:8: note: NaryNode::NaryNode()
tree.cpp:10:8: note: candidate expects 0 arguments, 2 provided
tree.cpp:10:8: note: NaryNode::NaryNode(const NaryNode&)
tree.cpp:10:8: note: candidate expects 1 argument, 2 provided
tree.cpp:10:8: note: NaryNode::NaryNode(NaryNode&&)
tree.cpp:10:8: note: candidate expects 1 argument, 2 provided
版本:
$ g++ --version
g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
构建命令:
$ g++ -std=c++0x tree.cpp
答案 0 :(得分:2)
从c ++ 11标准的 8.5.1 Aggregates 部分(草案n3337):
1聚合是一个数组或类(第9节),没有用户提供的构造函数(12.1),非静态数据成员(9.2)没有大括号或相等的初始值,没有私有或受保护的非静态数据成员(第11条),没有基类(第10条),没有虚函数(10.3)。
2当初始化程序列表(如8.5.4中所指定)初始化聚合时,初始化程序列表的元素 被视为聚合成员的初始化者,增加下标或成员顺序......
从 8.5.4列表初始化
部分开始可以使用列表初始化
- 作为变量定义中的初始化程序(8.5)
- 作为新表达式(5.3.4)
中的初始值设定项
这意味着NaryNode
是一个聚合,可以列表初始化(使用{}
)。
拒绝NaryNode
代码段的编译器不正确,g ++ v4.7.2编译得很好(参见http://ideone.com/LewfQE)。