std::vector и emplace_back()

201
27 февраля 2019, 10:00

Правильно ли я понимаю, что метод std::vector::emplace_back() вызывает конструктор, но не конструктор перемещения?

В документации сказано, что объект конструируется на месте, вызывая для объекта конструктор с заданными параметрами.

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

Может, это какой-то баг? Я уже явно давал методу emplace_back параметр типа size_t. И он все равно говорит, что невозможно вызвать конструктор перемещения...

#include <vector>
using namespace std;
class A
{
public:
    int i;
    A(const int _i) : i(_i){};
    A(const A &_a) = delete;
    A(A &&_a) = delete;
    A &operator=(const A &_a) = delete;
    A &operator=(A &&_a) = delete;
};
int main(int argc, char **argv)
{
    vector<A> vec;
    vec.reserve(100);
    vec.emplace_back(-1);
}
Answer 1

Метод std::vector::emplace_back действительно создает новый объект на месте, однако он может вызывать конструктор перемещения для уже существующих объектов когда емкости вектора перестает хватать и для хранения объектов выделяется новый массив.

Для хранения объекта в векторе он должен иметь копирующий или перемещающий конструктор.

READ ALSO
Как в C++ найти наибольший делитель числа?

Как в C++ найти наибольший делитель числа?

Пользователь вводит число N, нужно найти наибольший делитель числа N, не равный N

356
Использование UNICODE в С++ [закрыт]

Использование UNICODE в С++ [закрыт]

Нужно в строке UNICODE написать все символы в обратном порядкеОчень маленький опыт работы с UNICODE по-этому не понимаю что нужно исправить

204
Подключение библиотек в Ubuntu

Подключение библиотек в Ubuntu

При компиляции кода выдает следующие ошибки:

167