类(或结构)通过模板自引用
class (or struct) self-reference by template
以下内容合法吗?
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时可以使用不完全类型
T
17.6.3.5.1需求。T
应先于任何成员完成由此产生的专业化引用Vector
在此之前,vector
不能用不完全类型构造(tree_node
在这一点上),这将是未定义的行为。
相关文章:
- 深层复制具有自引用指针的类
- C++ 通过函数传递自定义结构
- 在C++中循环访问自定义结构列表的小问题
- 在结构中使用 switch 引用结构中的数据C++
- 如何在Qt中使用QDataStream将自定义结构保存/加载到二进制文件中?
- 自引用 c++20 概念
- 如何检查助推融合序列是否为自适应结构
- 复制引用结构上的赋值
- 结构向量中自定义结构函数的内存使用
- Boost.Spirit.Qi 语法,用于 Boost.Fusion 自适应结构中的默认值
- 类型转换自定义结构
- 使用结构绑定更改自定义结构的值
- 信号槽自定义结构问题
- 如何将unordered_set与自定义结构一起使用?
- 为什么C++在自定义结构向量时会出现 ostream 重载问题?
- 自引用类
- 通过引用将自定义结构的向量传递给 boost::compute 闭包或函数
- 正在取消引用自定义结构字段的迭代器
- 类(或结构)通过模板自引用
- Boost Fusion适应模板化自引用结构的声明