std :: vector, construção padrão, C ++ 11 e alterações recentes

Corri hoje contra uma questão bastante sutil sobre a qual gostaria de ter sua opinião.

Considere a seguinte classe de idioma de corpo compartilhado de variedade de jardim:

struct S
{
    S() : p_impl(new impl) {}
private:
    struct impl;
    boost::shared_ptr<impl> p_impl;
};

A diversão aparece quando você tenta colocá-los em vetores da seguinte maneira:

std::vector<S> v(42);

gora, com o MSVC 8, pelo menos, todos os elementos emv compartilham o mesmoimpl membro. Na verdade, o que causa isso é ovector construtor:

template <typename T, typename A = ...>
class vector
{
    vector(size_t n, const T& x = T(), const A& a = A());
    ...
};

Sob as cenas, apenas umS objeto é construído como padrão, on elementos dovector são copiados del

gora, com o C ++ 11, existem referências de rvalue. Portanto, não pode funcionar assim. Se umvector é construído como

std::vector<S> v(42);

, então provavelmente, as implementações escolherão a construção padrão don objetos dentro do vetor, pois a construção da cópia pode não estar disponível. Isso seria uma mudança de ruptura neste caso.

Minha pergunta é

O C ++ 03 ordena questd::vector deve ter um construtor definido como acima, ie. com um argumento padrão? Em particular, existe uma garantia de que as entradas do objeto de vetor sejam copiadas em vez da construção padrão?O que o padrão C ++ 11 diz sobre esse mesmo ponto? Vejo isso como uma possibilidade de uma alteração entre C ++ 03 e C + 11. Este problema foi investigado? Resolvido?

PS: Por favor, não há comentários sobre o construtor padrão da classeS acima. Foi isso ou implementar alguma forma de construção preguiços

questionAnswers(2)

yourAnswerToTheQuestion