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

nob*_*bar 10 c++ class language-lawyer self-reference

以下是合法的吗?

template< typename T >
struct tree_node
   {
   T t;
   std::vector<tree_node> children;
   };
Run Code Online (Sandbox Code Playgroud)

这篇文章的评论似乎表明事实并非如此.


编辑:这不会打击我作为"未定义的行为"类型的场景.预期的语义是明确的.如果它是不完整类型的无效用法,那么它应该是编译时错误.

在我的测试中,这似乎工作正常(我使用了GCCClang - 两者都有-Wall -Werror -std=c++11).

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


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

typedef int T;
struct tree_node;

struct tree_node
   {
   T t;
   tree_node * children;
   }
Run Code Online (Sandbox Code Playgroud)

Bar*_*rry 11

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

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

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