c++ - ¿Std:: make_shared realiza la inicialización de valores(GCC y clang no están de acuerdo)?
c++11 initialization (2)
Lo que entiendo para significar se puede explicar con el siguiente ejemplo:
auto p = std::make_shared<int>();
¿Está inicializada la variable int
inicializada (por lo tanto, tiene un valor de basura) o inicializada (por lo tanto, tiene un valor de cero)? He probado en GCC 5.2 y clang 3.6 con el primero haciendo inicialización de valor y el segundo haciendo inicialización por defecto. Me pregunto ¿qué dice la norma sobre esto? En mi opinión, C ++ moderno definitivamente debería realizar la inicialización de valores en este caso.
El estándar parece apoyar tu opinión.
A partir del 20.8.2.2.6:
construye un objeto en esa memoria a través de la ubicación new-expression :: new (pv) T (std :: forward (args) ...)
Dado que new int () tiene un valor inicializado, en contraste con new int, esperaría cero.
Sí.
N3797 20.8.2.2.6
Asigna memoria adecuada para un objeto de tipo T y construye un objeto en esa memoria a través de la nueva expresión de ubicación
::new (pv) T(std::forward<Args>(args)...)
Entonces, aquí estará
::new (pv) int();
Y así sucesivamente por N3797 8.5.1
La inicialización que se produce en los formularios.
T x(a); T x{a};
así como en nuevas expresiones (5.3.4) se llama inicialización directa.
La semántica de los inicializadores es la siguiente. El tipo de destino es el tipo de objeto o referencia que se está inicializando y el tipo de origen es el tipo de la expresión de inicializador. Si el inicializador no es una expresión única (posiblemente entre paréntesis), el tipo de fuente no está definido.
- Si el inicializador es
()
, el objeto está inicializado con valores.Para inicializar con valor un objeto de tipo
T
significa:- De lo contrario, el objeto es cero inicializado.
Y tanto el nuevo clang como el GCC coinciden con el estándar: Live