我可以使用不完整类型列表的迭代器吗?
May I use iterator of a list of an incomplete type?
struct some_struct
{
std::list<some_struct> nested;
};
IIUC 在过去这会调用 UB,因为标准容器只需要用完整类型实例化。
然而,现在我们已经从这里取得进展,根据 http://open-std.org/JTC1/SC22/WG21/docs/papers/2015/n4510.html 我们可以用不完整的类型实例化 std::list
、std::forward_list
和 std::vector
,所以上面的代码有效。
但是,但是,我可以更进一步写:
struct some_struct
{
std::list<some_struct>::iterator it;
};
?
实例化一个容器和使用它的成员类型是不一样的...例如,我被告知我可以实例化具有不完整类型的 boost 容器,但我可能不会使用它们 value_type
除非模板参数是一个完整的类型。所以我不太确定上面的代码片段是否有效。
是吗?
就是那篇论文说的
T
shall be complete before any member of the resulting specialization
of list
is referenced.
struct some_struct
{
std::list<some_struct> nested;
};
IIUC 在过去这会调用 UB,因为标准容器只需要用完整类型实例化。
然而,现在我们已经从这里取得进展,根据 http://open-std.org/JTC1/SC22/WG21/docs/papers/2015/n4510.html 我们可以用不完整的类型实例化 std::list
、std::forward_list
和 std::vector
,所以上面的代码有效。
但是,但是,我可以更进一步写:
struct some_struct
{
std::list<some_struct>::iterator it;
};
?
实例化一个容器和使用它的成员类型是不一样的...例如,我被告知我可以实例化具有不完整类型的 boost 容器,但我可能不会使用它们 value_type
除非模板参数是一个完整的类型。所以我不太确定上面的代码片段是否有效。
是吗?
就是那篇论文说的
T
shall be complete before any member of the resulting specialization oflist
is referenced.