下面給出類X
(不是明確定義的其他特殊成員函數是不相關的該實驗):爲什麼當容量超過時,resize()會導致向量內容的複製而不是移動?
struct X
{
X() { }
X(int) { }
X(X const&) { std::cout << "X(X const&)" << std::endl; }
X(X&&) { std::cout << "X(X&&)" << std::endl; }
};
下面的程序創建X
類型的對象的一個矢量並調整它,以便它的容量是突破和再分配強制:
#include <iostream>
#include <vector>
int main()
{
std::vector<X> v(5);
v.resize(v.capacity() + 1);
}
由於類X
提供了一個移動的構造,我希望向量的以前的內容是移動入T他重新分配後新的存儲空間。非常令人驚訝,that does not seem to be the case,輸出我得到的是:
X(X const&)
X(X const&)
X(X const&)
X(X const&)
X(X const&)
爲什麼?
還要注意的是_Microsoft_不尊重這個規則,使這個代碼_VisualÇ++編譯_(或_clang_上_Windows_)將調用移動的構造,從而可以讓你在'的std ::向量中斷(空)的元素'如果調整大小失敗。 – Denis