emplace_back 中的 std::vector emplace_back 调用 UB 或 bug clang/gcc?

Mar*_*rol 7 c++ c++11

我的代码中有一个错误,当放回到同一向量中时,它试图放回一些值。

最小的例子

#include <iostream>
#include <vector>


struct ComplexObject
{
    // for display only
    inline static int cpt {};
    int indice {};

    ComplexObject(std::vector<ComplexObject>& storage, int trick) 
    {

        indice = cpt;
        cpt++;

        if (trick == 0 )
        {
            std::cout << "Creating single Object. Storage size: " << storage.size() << std::endl;
        }
        else
        {
            std::cout << "Creating double Object. Storage size: " << storage.size() << std::endl;
            storage.emplace_back(storage, 0);
            std::cout << "Storage size after double creation : " << storage.size() << std::endl;
        }

    }
    
};


int main() {
   std::vector<ComplexObject> storage;
    storage.reserve(3); // no realoction

    storage.emplace_back(storage,0);
    std::cout << "_________ size after insert simple : " << storage.size()<<"_________" << std::endl;
    storage.emplace_back(storage,1);
    std::cout << "_________ size after insert double :" << storage.size() << std::endl;

    for (auto& e : storage)
    {
       std::cout << e.indice;
    }

}
Run Code Online (Sandbox Code Playgroud)

我预计最后一个循环的结果类似于012021

Clang 和 Gcc 得到不同的结果:

铿锵演示。输出 :

Creating single Object. Storage size: 0
_________ size after insert simple : 1_________
Creating double Object. Storage size: 1
Creating single Object. Storage size: 1
Storage size after double creation : 2
_________ size after insert double :2
02
Run Code Online (Sandbox Code Playgroud)

海湾合作委员会演示。输出 :

Creating single Object. Storage size: 0
_________ size after insert simple : 1_________
Creating double Object. Storage size: 1
Creating single Object. Storage size: 1
Storage size after double creation : 2
_________ size after insert double :3
020
Run Code Online (Sandbox Code Playgroud)

两者似乎都添加了元素1,然后用元素覆盖它2,但他们在向量的大小上存在分歧(我认为0gcc 中的最后一个是垃圾内存)

问题

这段代码感觉很糟糕,但我无法在https://en.cppreference.com/w/cpp/container/vector/emplace_back中找到任何告诉我不应该这样做的内容。

这个代码是UB吗?

  • 如果有,是哪一部分?
  • 如果不是的话,哪个编译器有问题?(叮当声对我来说更有意义)