При назначении копирования std::vector выполняется перераспределение хранилища и уменьшение емкости, если размер источника меньше целевой емкости? Или гарантируется, что перераспределение/сжатие не произойдет (т.е. Всегда соблюдайте предыдущий резерв())?
С другой стороны, если размер источника больше, чем пропускная способность назначения, и происходит перераспределение, требуется, чтобы перераспределение соответствовало емкости источника (например, новая емкость назначения должна быть не меньше, чем исходная емкость, или даже требуют, чтобы они были одинаковыми)? Или перераспределение просто выполняет свою работу (на основе нового размера) без учета мощности источника?
Как и для назначения переноса, я предполагаю, что перераспределение памяти не произойдет (хотя я не смог найти соответствующую часть в стандарте), значит ли это, что значение новой емкости назначения будет точно такой же, как и исходная старая емкость? Можно ли ожидать, что v = vector<T>{};
будет иметь тот же эффект, что и vector<T>{}.swap(v);
?
Я полагаю, что ответы похоронены где-то в стандарте, но я просто не смог их найти. (В случае, если что-то другое для С++ 11 и С++ 03, я хотел бы знать различные требования от обоих.)
PS: Для любого ответа вышеуказанных вопросов это то же самое для std::string (только в С++ 11, что означает непрерывное хранилище, а COW, С++ 03 не выходит из радара)?