Объект Emplace, полученный из не копируемого в вектор

У меня есть объекты, которые содержат указатели и делятся ими с другими. Перемещение их - это нормально, но копирование - нет. Я хотел бы хранить их в векторах и картах. Следующий код работает только тогда, когда A не имеет деструктора Однако мне понадобится деструктор, чтобы очистить мои указатели.

#include <vector>

struct OnlyMove
{
    OnlyMove(const OnlyMove&) = delete;
    OnlyMove& operator=(const OnlyMove&) = delete;
    OnlyMove(OnlyMove&&) = default;
    OnlyMove& operator=(OnlyMove&&) = default;

protected:
    OnlyMove() = default;
};

struct A : OnlyMove
{
    A(int){}
    ~A(){} // makes compilation fail
};

int main()
{
    std::vector<A> y;
    y.emplace_back(1);
}

Ошибка, когда у меня есть деструктор:

/usr/local/include/c++/8.2.0/bits/stl_construct.h: в экземпляре 'void std::_Construct(_T1*, _Args&& ...) [with _T1 = A; _Args = {A}]': … ошибка: использование удаленной функции'OnlyMove::OnlyMove(const OnlyMove&)'

Я не понимаю почему. Какую роль здесь играет деструктор?

Live Demo

1 ответ

Решение

Тебе нужно:

struct A : OnlyMove
{
    A(int){}
    A(A&&) = default;  // need this
    ~A() {} 
}; 

Когда вы вводите desctructor, конструктор перемещения исчезает. Без конструктора перемещения или конструктора копирования его нельзя поместить в вектор.

РЕДАКТИРОВАТЬ: конструктор перемещения лучше, если он noexcept, иначе std::vector::resize а также std::vector::push_back не имеют гарантий, когда создаются исключения.

Другие вопросы по тегам