Warum ruft der folgende Code a
's Copy Constructors auf?Erwartete Bewegung auf den Elementen von std :: vector, aber die Kopie wurde stattdessen gefunden, wenn versucht wird, sie als Parameter zu übergeben
class a {
public:
a(int x) : x_(x) { std::cout << "a constructor" << std::endl; }
a(a&& a_) { std::cout << "a move constructor" << std::endl; }
a(const a& a_) { std::cout << "a copy constructor" << std::endl; }
private:
int x_;
};
class b {
public:
b(std::vector<a>&& v) : v_(std::move(v)) {}
private:
std::vector<a> v_;
};
int main() {
b s({2, 3, 4, 5, 6});
}
Der Ausgang ist die folgende:
a constructor
a constructor
a constructor
a constructor
a constructor
a copy constructor
a copy constructor
a copy constructor
a copy constructor
a copy constructor
Ich war keine Kopie erwartet, da der Vektor an Ort und Stelle und übergeben als rvalue Referenz erstellt wird und danach bewegt. Was passiert eigentlich?
Genauer gesagt ist der Grund, dass der Konstruktor eine 'std :: initializer_list' (wobei 'T' ist der Wert Typ des Vektors) stattfindet und nicht eine' std :: initializer_list '(mit einigen zu nehmen Templat 'X'). Sonst könnten die 'a's durch den Vektor konstruiert werden. –