Данный класс X
ниже (специальные функции-члены, отличные от явно определенной, не относятся к этому эксперименту):
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
предоставляет конструктор перемещения, я ожидаю, что предыдущее содержимое вектора будет перемещено в новое хранилище после перераспределения. Удивительно, но это не так, и я получаю следующий вывод:
X(X const&)
X(X const&)
X(X const&)
X(X const&)
X(X const&)
Почему?
std::vector
в случае сбоя изменения размера. - person Denis   schedule 06.07.2017