sobrecarga poo metodos implementa ejemplos ejemplo definicion constructores como codigo clases c++ language-lawyer c++14

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.