以下是否合法?
template< typename T >
struct tree_node
{
T t;
std::vector<tree_node> children;
};
对this post的评论似乎暗示它不是。
编辑:这并没有把我视为“未定义行为”类型的场景。预期的语义是明确的。如果它是对不完整类型的无效使用,那么它应该是编译时错误。
In my tests这似乎工作正常(我使用了GCC和Clang - 都使用了-Wall -Werror -std=c++11
)。
语言定义(在C ++ 17之前)是否有某些内容直接或间接地将其指定为未定义的行为,或者只是指定不足?
请记住,这在结构上非常类似于以下内容:
typedef int T;
struct tree_node;
struct tree_node
{
T t;
tree_node * children;
}
答案 0 :(得分:11)
实际上,作为N4371的结果(来自N4527,[vector.overview],将在C ++ 17中):
如果分配器满足分配器完整性,则在实例化向量时可以使用不完整类型
T
要求17.6.3.5.1。T
在完成专业化的任何成员之前应完成 引用了矢量。
在此之前,vector
无法使用不完整的类型构造(tree_node
就在那一点),这将是未定义的行为。