我可以使用不完整类型列表的迭代器吗?

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::liststd::forward_liststd::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.