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