类(或结构)通过模板自引用 [英] class (or struct) self-reference by template
问题描述
以下是否合法?
template< typename T >
struct tree_node
{
T t;
std::vector<tree_node> children;
};
对这篇文章似乎暗示它不是。
作为未定义行为类型的场景。目标语义是明确的。如果它是不完整类型的无效使用,那么它应该是编译时错误。
This doesn't strike me as an "undefined behavior" type of scenario. The intended semantics are unambiguous. If it is an invalid usage of an incomplete type then it should be a compile-time error.
在我的测试这似乎工作正常(我使用了 GCC 和 Clang - 都使用 -Wall -Werror -std = c ++ 11
)。
In my tests this seems to work fine (I have used both GCC and Clang -- both with -Wall -Werror -std=c++11
).
在语言定义中(在C ++ 17之前),有直接或间接指定为未定义行为的东西,或者只是 / em>
Is there something in the language definition (prior to C++17) that directly or indirectly specifies this as undefined behavior, or is it just under-specified?
请记住,这在结构上非常相似,如下所示:
Keep in mind that this is very similar, structurally, to something like the following:
typedef int T;
struct tree_node;
struct tree_node
{
T t;
tree_node * children;
}
推荐答案
N4371 我们有(从N4527,[vector.overview] ,将在C ++ 17中):
Actually, as a result of N4371 we have (from N4527, [vector.overview], will be in C++17):
不完整的类型
T
在实例化向量时使用,如果分配器满足分配器的完整性
要求17.6.3.5.1。T
必须在引用
向量的所有专业化成员之前完成。
An incomplete type
T
may be used when instantiating vector if the allocator satisfies the allocator completeness requirements 17.6.3.5.1.T
shall be complete before any member of the resulting specialization of vector is referenced.
在此之前,向量
无法使用不完整类型构造( tree_node
那个点),这将是未定义的行为。
Prior to this, vector
could not be constructed with an incomplete type (which tree_node
is at that point), and that would be undefined behavior.
这篇关于类(或结构)通过模板自引用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!