2016-10-26 3 views
1

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?

Antwort

3

std::initializer_list<T> ist ein Wrapper um ein Array von const T Objekten. (Genauer gesagt ist std::initializer_list<T>::referenceconst T&). Beachten Sie die const. Es muss so sein, denn seine Elemente können Literale sein.

Dies bedeutet, dass der Konstruktor von std::vectorstd::initializer_list nehmen muss die Elemente aus der Liste in den Vektor kopieren, sie sich nicht bewegen kann.

+1

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. –

Verwandte Themen