Конструирование вектора в 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 обьектов, используя конструктор по умолчанию.

→ Ссылка