【发布时间】:2023-04-09 08:28:01
【问题描述】:
以下合法吗?
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;
}
【问题讨论】:
-
“shared_ptr 的例外”让我大吃一惊:stackoverflow.com/a/31347287/86967
-
最坏的情况,你可以使用
shared_ptr<tree_node>而不是tree_node。 -
...或者
shared_ptr<vector<tree_node>>。
标签: c++ class language-lawyer self-reference