2011-10-19 22 views
7

Esta pregunta también se ha enviado a Usenet, donde es más apropiado, pero este es un foro más grande y confiable.Inicialización directa vs uniforme en std :: asignador

std::allocator::construct se define para reenviar su parámetro argumento paquete de construcción objeto el uso de paréntesis, también denominado directo inicialización.

Si se usa aparatos ortopédicos, también denominado inicialización uniforme, se podría inicializar tipos de datos agregada de funciones tales como std::make_shared y container::emplace. Además, sería aceptable poner el contenido de una lista de inicializadores en la lista de argumentos de dicha función, , que resuelve el problema de initializer_list tipo de deducción bajo el reenvío .

¿Se consideró y rechazó esta alternativa? ¿Es demasiado tarde para cambiar en un futuro estándar? Parece que esto sería un cambio radical, pero no es particularmente atroz.

+3

Desbordamiento de pila mayor que _Usenet_ ?! : P –

+0

@Tomalak: más grande que comp.std.C++ y comp.lang.C++. Moderado, donde envié. Y mucho mejor que el comp.lang.C++ manicomio, con el que no me molesté. – Potatoswatter

+0

Te perdiste mi carita sonriente. –

Respuesta

9

No sé qué consideró el SC, pero tenga en cuenta que la inicialización uniforme realmente no 'funciona' en contextos genéricos (salvo la construcción de valores *). Considere este intento:

template<typename T, typename... Args> 
T 
make(Args&&... args) 
{ 
    return T { std::forward<Args>(args)... }; 
} 

Se obtiene:

assert(make<std::vector<int>>(10, 0).size() == 2); 
assert(std::vector<int>(10, 0).size() == 10); 

y esto no se compila:

make<std::vector<int*>>(10u, 0); 

mientras que esto hace:

std::vector<int*>(10u, 0); 

Si la interacción particular entre un envío perfecto y el inicializador enumera las causas que esto se formalizó lo suficientemente pronto como para que el SC no quiera reiniciar desde el principio.

(*): T {} está bien, incluso en contextos genéricos.

+0

Bah, la construcción Do The Right Thing. No he sido mordido por eso todavía. Aún así sería bueno tener una alternativa. El Estándar requiere que 'std :: is_constructible :: value' sea' true' para los argumentos de 'construct'; la inicialización directa podría ser una alternativa proporcionada por una implementación bajo el paraguas de UB. – Potatoswatter

+0

@Potatoswatt Dado que ese rasgo devolvería 'verdadero' si el tipo es construible usando inicialización directa, creo que quiere decir que la inicialización será uniforme. Una idea interesante, que es retrocompatible con las reglas actuales. –

+0

Sí, por supuesto: vP – Potatoswatter

Cuestiones relacionadas