Почему vector & lt; T & gt; :: emplace_back, такой, что T имеет конструктор удаленных копий, не компилируется?

Я не могу скомпилировать следующее dont_compile функция. Я не понимаю, почему это не работает. Но это работает с list,

class Thing {
public:
Thing() {}
Thing(const Thing &) = delete;
};

int dont_compile(int argc, char ** argv)
{
std::vector<Thing> v;
v.emplace_back();

return 0;
}

int compiles(int argc, char ** argv)
{
std::list<Thing> v;
v.emplace_back();

return 0;
}

Вот ошибка от компилятора. Это ошибка?

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/memory:1752:31: error: call to deleted constructor of 'Thing'
::new((void*)__p) _Up(_VSTD::forward<_Args>(__args)...);
^   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

... snip ...

note: 'Thing' has been explicitly marked deleted here
Thing(const Thing &) = delete;

Я не очень понимаю, как _Up(...) вызывает конструктор копирования

2

Решение

Это работает, когда у вас есть перемещение конструктора:

#include <vector>

class Thing {
public:
Thing() {}
Thing(const Thing &) = delete;
Thing(Thing&&) = default;
};

int main() {
std::vector<Thing> v;
v.emplace_back();
return 0;
}

Требования к типу std::vector::emplace_back могу предоставить больше информации.

5

Другие решения

std::vector::emplace_back требует, чтобы тип вектора был EmplaceConstructible так же как MoveInsertable, Поскольку вы удаляете конструктор копирования и не определяете конструктор перемещения самостоятельно, Thing не удовлетворяет второму требованию. По сравнению, std::list::emplace_back требуется только тип списка EmplaceConstructible,

6

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector