poo - Inicialización de valor de C++ 14 con constructor eliminado
ejemplos de sobrecarga de constructores en c++ (2)
Está bien formado. A
es un agregado 1 , y, de acuerdo con el borrador N3936 , una lista de inicializadores vacía utilizada en la inicialización de lista directa de un agregado genera una inicialización agregada:
De § 8.5.4 / 3 Inicialización de lista [dcl.init.list] :
La inicialización de lista de un objeto o referencia de tipo T se define de la siguiente manera:
- Si T es un agregado, se realiza la inicialización agregada (8.5.1).
[Ejemplo:
struct S2 { int m1; double m2, m3; };
....
S2 s23{}; // OK: default to 0,0,0
....
- ejemplo final]
....
Los cambios relevantes entre C ++ 11 y C ++ 1y son un cambio en la precedencia de la inicialización de agregado frente a valor para el caso de agregados:
C ++ 11 conduce con
La inicialización de lista de un objeto o referencia de tipo T se define de la siguiente manera:
- Si la lista de inicializadores no tiene elementos y T es un tipo de clase con un constructor predeterminado, el objeto se inicializa en valores.
- De lo contrario, si T es un agregado, se realiza la inicialización agregada (8.5.1) ....
seguido por el ejemplo de arriba.
C ++ 1y da prioridad a la inicialización agregada:
La inicialización de lista de un objeto o referencia de tipo T se define de la siguiente manera:
- Si T es un agregado, se realiza la inicialización agregada (8.5.1).
....
- De lo contrario, si la lista de inicializadores no tiene elementos y T es un tipo de clase con un constructor predeterminado, el objeto se inicializa en valores.
1 ¿Por qué A
es un agregado?
Es un agregado tanto en C ++ 11 como en C ++ 14.
C ++ 1y:
8.5.1 Agregados [dcl.init.aggr]
Un agregado es una matriz o una clase (Cláusula 9) sin constructores proporcionados por el usuario (12.1), sin miembros de datos no estáticos protegidos o privados (Cláusula 11), sin clases base (Cláusula 10) y sin funciones virtuales (10.3 )
La única parte que no es obvia es si el constructor predeterminado es proporcionado por el usuario o no. No es:
En § 8.4.2 [dcl.fct.def.default] :
Una función es proporcionada por el usuario si es declarada por el usuario y no está explícitamente predeterminada o eliminada en su primera declaración.
Tengo un malentendido
Marquemos el constructor predeterminado de la estructura A como eliminado:
struct A
{
A() = delete;
};
La siguiente instrucción está bien formada y ¿cuál es el efecto ?:
A a{};
Desde la inicialización del valor de cppreference :
1) Si T es un tipo de clase sin un constructor predeterminado o con un constructor predeterminado proporcionado por el usuario o con un constructor predeterminado eliminado, el objeto se inicializa por defecto.
pero luego el efecto de la inicialización predeterminada es:
Si T es un tipo de clase, se llama al constructor predeterminado para proporcionar el valor inicial para el nuevo objeto.
¿O es la inicialización global? ¡Gracias!
Tu struct A
es:
- un tipo de clase que tiene:
- no hay constructores proporcionados por el usuario 1 ,
- ningún miembro de datos no estáticos privados o protegidos,
- no hay clases base,
- no hay funciones de miembro virtual.
Por lo tanto, califica como un tipo agregado , de acuerdo con la definición proporcionada por el § 8.5.1 / 1.
Luego viene la prioridad de la inicialización agregada sobre la inicialización del valor. El estándar dice que la inicialización agregada tiene prioridad sobre la inicialización del valor (borrador N3936, § 8.5.4 / 3, página 201) (énfasis mío)
La inicialización de lista de un objeto o referencia de tipo T se define de la siguiente manera:
- Si T es un agregado, se realiza la inicialización agregada (8.5.1).
- De lo contrario, si la lista de inicializadores no tiene elementos y T es un tipo de clase con un constructor predeterminado, el objeto se inicializa en valores.
- [... más reglas ...]
(1) Como se solicitó en los comentarios sobre por qué un constructor eliminado no cuenta como definido por el usuario , esto es lo que dice la norma (borrador N3936, § 8.4.2 / 5, página 198):
Una función es proporcionada por el usuario si es declarada por el usuario y no está explícitamente predeterminada o eliminada en su primera declaración.