Mögliche Duplizieren:
initializer_list and move semanticsIst es sicher, Elemente einer Initialisierungsliste zu verschieben?
In diesem Code:
#include <vector>
#include <initializer_list>
template<typename T>
class some_custom_container : public std::vector<T>
{
public:
some_custom_container(const std::initializer_list<T>& contents)
{
for (auto& i : contents)
this->emplace_back(std::move(i));
}
};
class test_class
{};
int main()
{
test_class a;
some_custom_container<test_class> i = { a, test_class(), a };
}
Wenn ich es habe verstehen, werden alle Objekte in { a, test_class(), a }
sind sicher ausgebaute: die named- Objekte werden kopiert und die unbenannten Objekte werden verschoben, um die initializer_list zu erstellen. Danach wird diese initializer_list
mit Verweis auf den some_custom_container
Konstruktor übergeben.
Um unnötige Doppelkopien zu vermeiden, bewege ich alle, um den Vektor zu füllen.
Ist dieser Konstruktor sicher? Ich meine, in einer seltsamen Situation, zum Beispiel, wenn T als Referenz & oder & & ausgewertet wird, ist der Vektor immer gut gefüllt (enthält es sichere Objekte)?
Wenn dies der Fall ist, warum die initializer_list
Konstruktorimplementierungen von STL-Container auf diese Weise nicht implementiert sind? Wie ich weiß, kopieren ihre Konstruktoren den Inhalt und verschieben ihn nicht.
Es wird nicht einmal kompiliert, weil Initialisierungslisten nur const Zugriff auf ihre Inhalte bieten und Sie nicht von Referenzen auf const verschieben können. Siehe auch: http://stackoverflow.com/questions/8468774/can-i-list-initialize-a-vector-of-move-only-type –
Das wird nicht verhindern, dass es kompiliert, nur bewegt. Der Kopierkonstruktor würde aufgerufen werden. – Puppy