Конструирование вектора в C++11 ломает старый код
При портировании кода с C++98 на C++11 столкнулся с проблемой:
#include <iostream>
#include <vector>
struct A {
A() { std::cout << "1"; }
A(const A&) { std::cout << "2"; }
};
int main() {
std::vector<A>(5);
}
Этот код должен выводить 122222, а выводит 11111. Почему так происходит, и как исправить?
Ответы (1 шт):
Автор решения: EOF
→ Ссылка
Дело в том, что до С++11 у vector был конструктор
explicit vector( size_type count,
const T& value = T(),
const Allocator& alloc = Allocator());
который создавал в контейнере count копий обьекта value, используя конструктор копирования для T. Но когда пришёл С++11, то этот конструктор был заменён на
vector( size_type count,
const T& value,
const Allocator& alloc = Allocator());
Теперь, что бы сохранить поведение конструктора из С++98, необходимо передавать вторым аргументом обьект, из которого будут создаваться копии. Примерно так:
std::vector<A>(5, A());
В Вашем случае поведение изменилось, потому что Ваш код вызывает конструктор
explicit vector( size_type count );
который создает count обьектов, используя конструктор по умолчанию.