Требует ли в стандарте C ++ 03, что std::vector
должен иметь конструктор, определенный выше, то есть с аргументом по умолчанию?В частности, есть ли гарантия, что записи векторного объекта будут скопированы, а не созданы по умолчанию?
Да, указанное поведение таково, что x
копируется n
раз, так что контейнер инициализируется так, чтобы в нем содержалось n
элементов, которые все являются копиями x
.
Что стандарт C ++ 11 говорит об этом же пункте?
В C ++ 11 этот конструктор был превращен в два конструктора.
vector(size_type n, const T& x, const Allocator& = Allocator()); // (1)
explicit vector(size_type n); // (2)
За исключением того факта, что у него больше нет аргумента по умолчанию для второго параметра, (1) работает так же, как и в C ++ 03: x
копируется n
раз.
Вместо аргумента по умолчанию для x
, (2) был добавлен.Этот конструктор value-инициализирует n
элементов в контейнере.Копии не создаются.
Если вам требуется старое поведение, вы можете убедиться, что (1) вызывается, предоставив второй аргумент для вызова конструктора:
std::vector<S> v(42, S());
Я вижу в этом возможность прорыва между C ++ 03 и C ++ 11.Я вижу в этом возможность переломного изменения между C ++ 03 и C ++ 11.Была ли исследована эта проблема?Решено?
Да, как показывает ваш пример, это действительно серьезное изменение.
Поскольку я не являюсь членом комитета по стандартизации C ++ (и я не обращал особо пристального внимания на связанные с библиотекой статьи в рассылках), я не знаю, в какой степени обсуждалось это критическое изменение.