Verilen aşağıda sınıfı X
(açıkça tanımlanmış olandan başka özel üye fonksiyonları bu deney için uygun değildir):Yeniden boyutlandırma(), kapasite aşıldığında bir vektörün içeriğinin bir hareketinden ziyade bir kopyasına neden neden oluyor?
struct X
{
X() { }
X(int) { }
X(X const&) { std::cout << "X(X const&)" << std::endl; }
X(X&&) { std::cout << "X(X&&)" << std::endl; }
};
aşağıdaki program türü X
nesnelerin bir vektör oluşturur ve kapasitesi olacak şekilde yeniden boyutlandırır t içine taşındı sınıf X
bir hareket yapıcısı sağladığından
#include <iostream>
#include <vector>
int main()
{
std::vector<X> v(5);
v.resize(v.capacity() + 1);
}
, ben vektör önceki içerik olmasını beklediğiniz: aşıldı ve yeniden tahsis zorlanır yeniden tahsis ettikten sonra yeni depolama. Oldukça şaşırtıcı that does not seem to be the case ve ben olsun çıktısı:
X(X const&)
X(X const&)
X(X const&)
X(X const&)
X(X const&)
Neden?
Ayrıca _Microsoft_'ın bu kurala uymadığını unutmayın, bu kod _Visual C++ _ (veya _clang_ on _Windows_) ile derlenen bu kod yapıcıyı çağırır ve böylece std :: vektöründe bozuk (boş) öğeler bırakabilir Yeniden boyutlandırma hatası durumunda. – Denis