Ich habe einen Typ, den ich den Kopierkonstruktor gelöscht habe, und ich hätte gerne eine vector
dieses Typs, also muss ich alle Elemente über emplace_back
erstellen. Aber emplace_back
scheint einen Kopierkonstruktor zu benötigen, da der Compiler eine Warnung gibt, dass emplace_back
nicht instanziiert werden kann, weil der Kopierkonstruktor gelöscht wurde. Warum benötigt es einen Kopierkonstruktor? Ich dachte, der ganze Sinn von emplace_back
war, die vector
zu bauen, ohne etwas zu kopieren. Kann ich sogar eine vector
von Objekten haben, die keinen Kopierkonstruktor haben?Warum funktioniert diese Verwendung von emplace_back mit dem Konstruktor für gelöschte Kopien nicht?
class MyType {
public:
MyType(std::array<double, 6> a) {}
MyType(const MyType& that) = delete;
};
int main() {
std::vector<MyType> v;
std::array<double, 6> a = {1,2,3,4,5,6};
v.emplace_back(a);
}
Compiler ist clang/llvm.
http://cpp.sh/9v5w hier funktioniert nicht –
hier auch http://goo.gl/eLUPjR –
'emplace_back' brauchen nicht die Kopie Konstruktor, aber wenn die Kapazität von Vektor ist nicht genug zu speichern neues Element, Vektor muss sein Element neu zuweisen, dies erfordert den Konstruktor copy/move. Durch das Löschen des Kopierkonstruktors verhindern Sie auch, dass der Standardbewegungskonstruktor generiert wird. In diesem Fall deklarieren Sie einen Move-Konstruktor möglicherweise – Danh