2011-06-29 7 views
5

que he visto que several assertions C89 y C++ 03 definen reglas estrictas aliasing. Yo, sin embargo, no puedo encontrar ese bit en particular en el estándar. Según entendí, se agregaron estrictas reglas de aliasing en C99.¿C89 o C++ 03 definen reglas de alias estrictas?

+1

Cité la totalidad de C++ 03 3.10/15, que enumera las formas válidas de aliasing, [en una respuesta a otra pregunta] (http://stackoverflow.com/questions/4807643/container-covariances-in -c/4807726 # 4807726). –

Respuesta

5

El C++ 03 estándar tiene la siguiente bajo §3.10 [basic.lval] p15:

Si un programa intenta acceder al valor almacenado de un objeto a través de un lvalue distinta de uno de los siguientes tipos el comportamiento es indefinido 48):
- el tipo dinámico del objeto,
- una versión cv calificado del tipo dinámico del objeto,
- un tipo que se la firmó o tipo sin signo correspondiente al tipo de dinámica del objeto ,
- un tipo que es el tipo firmado o sin firmar correspondiente a una versión cv-calificada del tipo dinámico del objeto,
- un agregado o tipo de unión que incluye uno de los tipos mencionados entre sus miembros (incluido, recursivamente, un miembro de una subagregado o unión contenida),
- un tipo que es un() tipo de clase base posiblemente cv calificado del tipo dinámico del objeto,
- un char o tipo unsigned char.

Nota al pie:

48) La intención de esta lista es especificar aquellas circunstancias en las que un objeto puede o no puede tener un alias.

This site también enumera las secciones en las otras normas.

+0

Comprobando esto porque seleccioné explícitamente tu respuesta en la pregunta. –

5

Este texto está presente en C89, §3.3 expresiones:

Un objeto tendrá su almacenado valor visitada solamente por un lvalue que tiene uno de los siguientes tipos:

  • el tipo declarado del objeto,

  • una versión calificada del tipo de objeto declarado ,

  • un tipo que se la firmó o tipo sin signo correspondiente a la
    tipo declarado del objeto,

  • un tipo que se la firmó o tipo sin signo correspondiente a una versión calificada de la
    tipo declarado del objeto,

  • un tipo de agregado o unión que incluye uno de la mencionada
    tipos entre sus miembros (incluyendo, de forma recursiva, un miembro de un subagregado
    contenida o unión), o

  • un tipo de carácter.

Violación de un "deberá" restricción conduce a un comportamiento no definido, por lo que un conjunto de reglas de solapamiento permitidas se puede derivar de este texto.

5

3,3 en C89, 3,10/15 en C++ 03.

Ambos tienen una nota al pie, palabras para el efecto de, "el propósito de esta lista es indicar cuándo un objeto puede o no tener un alias".

+0

estupido ctrl-f! (¡Busqué la palabra "alias"! ¡Honesto!) –

Cuestiones relacionadas