支持结构的初始化

时间:2013-06-25 10:28:06

标签: c++11 list-initialization

在以下代码中

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

1 个答案:

答案 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)。