Я побежал сегодня против довольно тонкого вопроса, на который я хотел бы высказать свое мнение.
Рассмотрим следующий садово-парковый класс с общим телом и идиомой:
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
копируются из него.
Теперь, с С++ 11, есть ссылки rvalue. Поэтому он не может работать так. Если a vector
построено как
std::vector<S> v(42);
то, скорее всего, реализации предпочтут по умолчанию построить объекты n
внутри вектора, так как построение копии может быть недоступно. Это было бы изменением в этом случае.
Мой вопрос:
- Указывает ли стандарт С++ 03, что
std::vector
должен иметь конструктор, определенный выше, т.е. с аргументом по умолчанию? В частности, есть ли гарантия того, что записи векторного объекта будут скопированы вместо построенного по умолчанию? - Что говорит стандарт С++ 11 об этой же точке?
- Я рассматриваю это как возможность для разрыва между С++ 03 и C + 11. Рассмотрена ли эта проблема? Решено?
PS: Пожалуйста, никаких комментариев о конструкторе по умолчанию для класса S
выше. Это было или реализовано в какой-то форме ленивой конструкции.