programacion lenguaje funciones estructuras estructura ejercicios con ats atc arreglo array anidadas c++

lenguaje - Extraño comportamiento de las estructuras en C++



programacion atc (2)

Considerar:

struct box { int array[3]; }; int main() { box a = {1}; }

Si lo anterior funciona en C ++, ¿por qué no funciona lo siguiente?

struct box { int simple_int; }; int main() { box b = 2; }

¿Cual es la razon?


Correctamente, el primero usaría el box a = { { 1 } } , para que tenga un conjunto de llaves para cada agregado. El conjunto externo de llaves es para la estructura, y el conjunto interno es para la matriz. Sin embargo, el idioma le permite omitir llaves internas.

En este último, no hay llaves internas para omitir. No puedes omitir llaves externas; debe tener al menos un conjunto de llaves para distinguir una lista de inicializadores para un agregado. En cierto sentido, las llaves dicen "Aquí hay una lista de cosas para poner dentro del agregado". Cuando escribe el box b = 2 , el compilador no sabe que quiere poner 2 dentro del agregado. En cambio, parece que está intentando inicializar el objeto b (en lugar de hacerlo en parte) en 2 . Entonces el compilador intenta encontrar un constructor o una conversión que cambie un 2 en un box . Cuando esto falla, obtienes un error.


No funciona porque tu sintaxis es incorrecta. Puede agregar soporte para b = 2 con un constructor implícito, si eso es lo que quiere.

box b = {2}; // correct syntax with no constructor

O

struct box { // implicit constructor box(int i) : i(i) {} int i; }; box b(2); box c = 2;

O

struct box { explicit box(int i) : i(i) {} int i; }; box b(2); box c = 2; // disallowed