c++ c++11 initialization language-lawyer

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