2011-04-06 6 views
13

Puede alguien explicar esta declaración de ISO N3242 § 3.2, segundo punto¿Alguien puede explicar este párrafo del borrador estándar actual de C++ 0x?

Una expresión es potencialmente evaluado a menos que sea un operando sin evaluar (cláusula 5) o una sub-expresión de los mismos. Una función variable o no sobrecargada cuyo nombre aparece como una expresión potencialmente evaluada es odr-used a menos que sea un objeto que cumpla los requisitos para aparecer en una expresión constante (5.19) y la conversión lvalue-a-rvalue (4.1) es inmediatamente aplicado. esto es odr-used si aparece como una expresión potencialmente evaluada (incluida como resultado de la transformación implícita en el cuerpo de una función miembro no estática (9.3.1)).

ISO Standard 2003: dice

Una expresión se evalúa potencialmente menos que aparezca cuando se requiere un integral expresión constante (ver 5.19), es el operando del operador sizeof (5,3 .3), o es el operando del operador typeid y la expresión no designa un lvalue del tipo de clase polimórfica (5.2.8). Se utiliza un objeto o una función no sobrecargada si su nombre aparece en una expresión potencialmente evaluada .

¿Cuál es la diferencia real en estas afirmaciones?

¿Alguien puede explicar esto con la ayuda de un ejemplo/programa?

+0

@Andrea: no solo explicando ... pedí la diferencia/comparación ... para el antiguo uno nuevo – 1User

+1

Traté de resumir la pregunta en el título, no dude en solucionarlo. –

Respuesta

12

"operando no evaluado" reemplaza "es el operando del operador sizeof (5.3.3), o es el operando del operador typeid y la expresión no designa un lvalue del tipo de clase polimórfica (5.2.8)". Tiene el mismo propósito básico, pero no intenta enumerar todos los casos en el estándar C++ 0x de operadores cuyos operandos no se evalúan. decltype es uno nuevo, por ejemplo.

"odr-used" reemplaza "used", supongo que se dieron cuenta de que "used" solo podría ser ambiguo con otros usos de la palabra "use" en el estándar. En ambos casos, sin embargo, está definiendo el sentido de "usado" que es relevante para la ODR.

Así que esos no son realmente cambios, solo reformulaciones actualizadas para C++ 0x.

Este es un cambio:

Una función variable o no sobrecargado cuyo nombre aparece como una expresión evaluada potencialmente- es utiliza ODR-a menos que sea un objeto que satisface los requisitos para que aparece en una expresión constante (5.19) y se aplica la conversión lvalue-to-rvalue (4.1) inmediatamente
.

vs.

Un objeto o no sobrecargado función se utiliza si su nombre aparece en un evaluado potencialmente-
expresión.

Supongamos a es una static const int en el ámbito global. Luego, en C++ 03 no se utiliza en la siguiente afirmación:

char x[a]; 

porque el contexto requiere una expresión constante. Sin embargo, se usa en lo siguiente:

void foo(int); foo(a); 

porque el contexto no requiere una expresión constante.

En C++ 0x, a es no odr-used en cualquier caso. Se permite que esté en una expresión constante, y en la llamada a la función, la conversión lvalue-rvalue se aplica inmediatamente (porque foo toma su parámetro por valor, no como referencia). Por lo tanto, califica para el "a menos" que no estaba presente en C++ 03.

También hay una diferencia en la definición de "potencialmente evaluado". En el primer ejemplo, char x[a], a se evalúa potencialmente en C++ 03 pero no en C++ 0x. No he comprobado si alguna otra cosa en el estándar usa "potencialmente evaluada", que podría verse afectada por este cambio. Si solo se menciona aquí, entonces esa parte no es un cambio, es solo que la excepción se ha movido de "potencialmente evaluada" a "usada".

+0

¿Puede explicar con otro ejemplo con respecto a este cambio – 1User

+0

No consigo una cosa aunque si en una declaración 'char x [a];' 'a' no se usa, entonces, ¿cómo el compilador conocerá el tamaño de la matriz para poner el objeto de matriz en la memoria? –

+0

@ Mr.Anubis: el objeto 'a' no se usa, su valor es. Como este valor se conoce en tiempo de compilación, no es necesario que el objeto esté en tiempo de ejecución. –

Cuestiones relacionadas