简体   繁体   中英

May I use iterator of a list of an incomplete type?

struct some_struct
{
    std::list<some_struct> nested;
};

IIUC in the past this would invoke UB because the standard containers required to be instantiated only with complete types.

Now, however, we have progressed from this and as per http://open-std.org/JTC1/SC22/WG21/docs/papers/2015/n4510.html we can instantiate std::list , std::forward_list and std::vector with incomplete types, so the above code is valid.

But, but, may I go further a little and write:

struct some_struct
{
    std::list<some_struct>::iterator it;
};

?

Instantiating a container and using its member types is not the same... For example, I was told that I may instantiate boost containers with incomplete types, but I may not use their value_type unless the template argument is a complete type. So I'm not really sure if the above code snippet is valid.

Is it?

That very paper says

T shall be complete before any member of the resulting specialization of list is referenced.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM