-1. Вы можете не соглашаться с вопросами дизайна плаката, сколько хотите, но программа в вопросе является действительной и хорошо сформированной как в старом, так и в новом стандарте. Вопрос в том, является ли она одной и той же программой по обоим стандартам, а не в проектных решениях.
ня я столкнулся с довольно тонкой проблемой, о которой я хотел бы узнать ваше мнение.
Рассмотрим следующий класс с общими именами сада:
struct S
{
S() : p_impl(new impl) {}
private:
struct impl;
boost::shared_ptr<impl> p_impl;
};
Веселье появляется, когда вы пытаетесь поместить их в векторы следующим образом:
std::vector<S> v(42);
Теперь, по крайней мере, с MSVC 8, все элементы вv
делить то же самоеimpl
член. На самом деле, что вызывает этоvector
конструктор:
template <typename T, typename A = ...>
class vector
{
vector(size_t n, const T& x = T(), const A& a = A());
...
};
Под кулисами только одинS
объект получает конструкцию по умолчанию,n
элементыvector
скопированы с него.
Теперь, с C ++ 11, есть ссылки на значения. Так что это не может работать так. Еслиvector
построен как
std::vector<S> v(42);
тогда, скорее всего, реализации выберут по умолчанию построитьn
объекты внутри вектора, так как конструкция копирования может быть недоступна. Это было бы серьезным изменением в этом случае.
Мой вопрос:
Соответствует ли стандарт C ++ 03 тому, чтоstd::vector
должен иметь конструктор, определенный выше, т.е. с аргументом по умолчанию? В частности, есть ли гарантия, что записи векторного объекта будут скопированы, а не созданы по умолчанию?Что стандарт C ++ 11 говорит об этом же пункте?Я вижу в этом возможность переломного изменения между C ++ 03 и C + 11. Была ли исследована эта проблема? Решено?PS: Пожалуйста, никаких комментариев о конструкторе класса по умолчаниюS
выше. Это было это или реализация некоторой формы ленивой конструкции.