2

在下面的代码中

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
4

1 回答 1

2

从 c++11 标准的第8.5.1 节聚合(n3337 草案):

1 聚合是一个数组或一个类(第 9 条),没有用户提供的构造函数(12.1),没有非静态数据成员的大括号或等号初始化器(9.2),没有私有或受保护的非静态数据成员(第 11 条),没有基类(第 10 条),也没有虚函数(10.3)。

2 当聚合由初始化列表初始化时,如 8.5.4 中所指定,初始化列表的元素被视为聚合成员的初始化,按递增的下标或成员顺序...

并从第8.5.4 节 List-initialization

可以使用列表初始化

  • 作为变量定义中的初始化器(8.5)
  • 作为新表达式中的初始化器 (5.3.4)

这意味着NaryNode是一个聚合,可以列表初始化(使用{})。编译器拒绝该NaryNode片段是不正确的,g++ v4.7.2 可以很好地编译它(参见http://ideone.com/LewfQE)。

于 2013-06-25T13:47:41.413 回答