Я хочу использовать vector::emplace
по умолчанию построить без копируемых и без назначаемой объекта, а затем использовать специальные методы объекта, используя итератор на вновь созданный объект. Обратите внимание, что конструкторы класса без параметров не являются конструкторами по умолчанию. Простой пример:Emplacing в векторе, используя конструктор по умолчанию
#include <iostream>
#include <vector>
using namespace std;
class Test {
public:
Test() {}
private:
Test(const Test&) = delete; // To make clas un-copyable.
Test& operator=(const Test&) = delete;
int a_;
};
int main() {
vector<Test> test_vec;
test_vec.emplace_back(); // <---- fails
return 0;
}
vector::emplace()
создает новый объект, но требует аргументов не по умолчанию конструктора. vector::emplace_back()
будет построен в конце вектора.
Есть ли способ заменить конструкцию по умолчанию. Есть ли способ использовать кусочную конструкцию или переадресацию по умолчанию, возможно, используя std::piecewise_construct
, как есть для карт? Например, в случае карт мы можем использовать:
std::map<int,Test> obj_map;
int val = 10;
obj_map.emplace(std::piecewise_construct,
std::forward_as_tuple(val),
std::forward_as_tuple());
Есть ли что-то подобное для векторов?
Является ли ваш тип движимым? – dyp
Да, но он не может быть назначен или скопирован. См. Пример [здесь] (http://ideone.com/49LKaP).Использование 'emplace_back()' приводит к ошибке компиляции. –
@RizwanC Эта ошибка связана с тем, что тип не * подвижный *. Разработанный пользователем конструктор копирования подавляет генерацию конструктора перемещения по умолчанию. Вам нужно объявить конструктор перемещения по умолчанию (и переместить-присваивание, если хотите), после чего вам не нужны операции удаления копии, так как объявление операций перемещения будет подавлять неявное генерирование копий. – Casey