类(或结构)按模板自引用

时间:2015-09-09 19:20:00

标签: c++ class language-lawyer self-reference

以下是否合法?

template< typename T >
struct tree_node
   {
   T t;
   std::vector<tree_node> children;
   };

this post的评论似乎暗示它不是。

编辑:这并没有把我视为“未定义行为”类型的场景。预期的语义是明确的。如果它是对不完整类型的无效使用,那么它应该是编译时错误。

In my tests这似乎工作正常(我使用了GCCClang - 都使用了-Wall -Werror -std=c++11)。

语言定义(在C ++ 17之前)是否有某些内容直接或间接地将其指定为未定义的行为,或者只是指定不足

请记住,这在结构上非常类似于以下内容:

typedef int T;
struct tree_node;

struct tree_node
   {
   T t;
   tree_node * children;
   }

1 个答案:

答案 0 :(得分:11)

实际上,作为N4371的结果(来自N4527,[vector.overview],将在C ++ 17中):

  

如果分配器满足分配器完整性,则在实例化向量时可以使用不完整类型T   要求17.6.3.5.1。 T在完成专业化的任何成员之前应完成   引用了矢量。

在此之前,vector无法使用不完整的类型构造(tree_node就在那一点),这将是未定义的行为。