类(或结构)通过模板自引用

class (or struct) self-reference by template

本文关键字:自引用 结构      更新时间:2023-10-16

以下内容合法吗?

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

对这篇文章的评论似乎表明它不是。


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

在我的测试中,这似乎工作得很好(我使用了GCC和Clang——都是-Wall -Werror -std=c++11)。

是否在语言定义中(c++ 17之前)直接或间接地将其指定为未定义的行为,或者只是未指定的?


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

typedef int T;
struct tree_node;
struct tree_node
   {
   T t;
   tree_node * children;
   }

实际上,作为N4371的结果,我们有(来自N4527), [vector]。,将在c++ 17中出现):

如果分配器满足分配器完整性,则在实例化vector时可以使用不完全类型T17.6.3.5.1需求。T应先于任何成员完成由此产生的专业化引用Vector

在此之前,vector不能用不完全类型构造(tree_node在这一点上),这将是未定义的行为。