-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 выше. Это было это или реализация некоторой формы ленивой конструкции.

Ответы на вопрос(2)

Ваш ответ на вопрос