sirve resueltos registros que para operaciones estructuras ejercicios con arreglos c++ language-lawyer

resueltos - registros en c++ pdf



¿Las estructuras de variables del mismo tipo de diseño son compatibles con una estructura que contiene una matriz de ese tipo? (2)

¿Son estas 2 estructuras compatibles con el diseño?

struct One { float x, y, z; }; struct Two { float c[3]; };

Ambos contienen 3 flotadores, por lo que, de alguna manera, esta descripción puede considerarse verdadera (de N3797):

16 Dos tipos de estructura de diseño estándar (Cláusula 9) son compatibles con el diseño si tienen el mismo número de miembros de datos no estáticos y los miembros de datos no estáticos correspondientes (en orden de declaración) tienen tipos compatibles con el diseño (3.9).

N4659 tiene un texto diferente:

La secuencia inicial común de dos tipos de estructuras de disposición estándar (Cláusula 12) es la secuencia más larga de miembros de datos no estáticos y campos de bits en orden de declaración, comenzando con la primera entidad de este tipo en cada una de las estructuras, de manera que las entidades correspondientes tengan Los tipos compatibles con el diseño y ninguna de las dos entidades es un campo de bits o ambos son campos de bits con el mismo ancho.

Dos tipos de estructura de diseño estándar (Cláusula 12) son clases compatibles con el diseño si su secuencia inicial común comprende todos los miembros y campos de bits de ambas clases (6.9).

Si la respuesta es no , no son compatibles con el diseño, entonces: ¿fue la intención del comité? Tal vez ellos quieran que One y Two sean compatibles con el diseño (tal vez un miembro del comité lea esto y pueda aclarar).

Pregunta extra: ¿está garantizado, que sizeof(One)==sizeof(Two) ?


Bueno no:

[...] si tienen el mismo número de miembros de datos no estáticos [...]

One tiene tres miembros: x , y , y z . Two tiene un miembro: c . No tienen el mismo número de miembros de datos no estáticos, por lo que no son compatibles con el diseño.

La nueva redacción es diferente, pero terminas en el mismo lugar. [basic.types] define el diseño compatible como:

Dos tipos cv1 T1 y cv2 T2 son tipos compatibles con el diseño si T1 y T2 son del mismo tipo, enumeraciones compatibles con el diseño o tipos de clase de diseño estándar compatibles con el diseño.

[class.mem] define clases compatibles con el diseño son:

Dos tipos de estructuras de diseño estándar son clases compatibles con el diseño si su secuencia inicial común comprende todos los miembros y campos de bits de ambas clases ([basic.types]).

Donde la secuencia inicial común es:

La secuencia inicial común de dos tipos de estructuras de disposición estándar es la secuencia más larga de miembros de datos no estáticos y campos de bits en orden de declaración, comenzando con la primera entidad de este tipo en cada una de las estructuras, de modo que las entidades correspondientes tengan tipos compatibles con la disposición y ninguna de las dos entidades es un campo de bits o ambas son campos de bits con el mismo ancho.

Aquí, el primer miembro de One ( float x ) no es compatible con el diseño del primer miembro de Two ( float c[3] ), por lo que la secuencia inicial común está vacía.


El compilador tiene permitido agregar relleno entre los miembros de una class o struct .

Los elementos de la matriz están en ubicaciones contiguas.

Es posible que no sean compatibles con el diseño, dependiendo de cómo el compilador organiza a los miembros en la struct .