当与不完整类型一起使用时,std::map::reverse_iterator 不适用于 C++20

Kal*_*Kal 5 c++ iterator stdmap language-lawyer reverse-iterator

我注意到下面示例中的使用std::map::reverse_iterator不适用于 C++20,但适用于所有编译器中的 C++17。

演示

演示MSVC

#include <map>
class C; //incomplete type 

class Something
{
    
    //THIS WORKS IN C++17 as well as C++20 in all compilers
    std::map<int, C>::iterator obj1;
    
    //THIS DOESN'T WORK in C++20 in all compilers but works in C++17 in all compilers
    std::map<int, C>::reverse_iterator  obj2;
};

int main()
{
    Something s;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是so(such)发生了什么变化,导致所有编译器中的C++20使用停止工作。std::map::reverse_iteratorC++20

ala*_*ner 7

它在 C++20 之前偶然工作,按照标准,在 std 容器中使用不完整类型是 UB(除了 、vector以及listforward_listC++17 以来)。看这里。因此,它可能会工作,也可能随时停止工作,但基本上任何事情都有可能发生,不应该依赖它。

如果能够存储不完整的类型是您的用例的硬性要求,您可能需要检查boost::container.