2011-02-24 7 views
6

He estado leyendo bastantes en Internet y parece que muchas personas mencionaron las siguientes reglas (pero no pude encontrarlo en el estándar),En cuanto a la conversión lvalue-a-rvalue, ¿cuándo se requiere?

El operador de suma + (y todos los demás operadores binarios) requiere que ambos operandos sean rvalue, y el resultado es rvalue. Y así sucesivamente ..

he comprobado el estándar de C++, y se establece claramente que (cláusula 3.10/2),

Cada vez que un glvalue aparece en un contexto donde se espera una prvalue, la glvalue se convierte en un prvalue

(cláusula 5/9),

siempre que aparezca una expresión glvalue como un operando de un operador que espera un prvalue para que operando, los-lvalue-a rvalue (4.1), -array-a puntero (4.2), o -function-a puntero (4.3) estándar conversiones se aplican para convertir la expresión en un valor pr.

Utiliza un término que el operando "espera" un prvalue. Sin embargo, cuando veo el operador adicional, el operador de multiplicación, etc., solo menciona que, el resultado es un valor pr, pero no dice nada sobre lo que se espera que sean los operandos.

Ya sea que hace el operador binario realmente espera que los operandos a prvalue hace una diferencia en el siguiente caso,

int b = 2; 
int a = b + 1; 

Si se espera b para ser un prvalue, habrá una conversión de valor-i-a rvalue aquí, y luego realizará prvalue + prvalue y devolverá un prvalue, y el prvalue del resultado se asignará a un lvalue a.

Sin embargo, si no se requiere que b sea un valor pr, sería lvalue + prvalue y el resultado es un valor pr.

Realmente quiero saber dónde menciona explícita o implícitamente la norma que las reglas para diferentes operadores? Verifico en toda la sección de operadores y solo en unos pocos operadores que los estándares mencionan explícitamente si los operandos y los resultados serán lvalue o rvalue. Para la mayoría de los operadores, el estándar solo menciona el resultado pero no el requisito de operando.

Gracias.


Por cierto, me encontré en la Norma 5.19 respecto expresión constante puede muy muy "implícitamente" implica que el operador binario requiere conversión-valor-i-a rvalue sobre operandos. Para más detalles, por favor refiérase a mi pregunta anterior,

mixing use of constexpr and const?

Un condicional-expresión es una constante expresión a menos que implique una de lo siguiente como una subexpresión potencialmente evaluado (3.2).

...

- una conversión-lvalue-a rvalue (4.1) a menos que se aplica a

---- un glvalue de tipo integral o enumeración que se refiere a un no objeto const medicamentos basados ​​en con una inicialización precedente, inicializa con una expresión constante

Gracias por leer.

Respuesta

4

Por lo tanto, esta es generalmente una de esas partes inferidas y mal especificadas del estándar; Sin embargo, en 3,10

[Nota: algunos operadores internos esperan operandos lvalue. [Ejemplo: los operadores de asignación incorporados esperan que sus operandos de la izquierda sean lvalues. - end example] Otros operadores incorporados producen valores r, y algunos los esperan. [Ejemplo: los operadores unario y binario + esperan argumentos rvalue y arrojan resultados rvalue. - end example] La discusión de cada operador incorporado en la cláusula 5 indica si espera operandos lvalue y si produce un valor l. - nota final]

Aviso de la lengua poco especificado "en la cláusula 5 indica si se espera operandos lvalue y si se produce un valor-I".

El examen del Capítulo 5 indica que se enumeran todos los casos donde una expresión necesita o devuelve un lvalue, sin embargo, se enumeran muy pocos casos que tratan específicamente con rvalues, creo que se supone que el resto son valores r.

También sospecho que está mal especificado porque, desde la perspectiva del estándar, no es particularmente importante si el operador realiza la conversión implícita o explícitamente, independientemente de si el comportamiento debe ser consistente y de buen comportamiento.

+0

Gracias. Sin embargo, las afirmaciones anteriores que citó se eliminaron en el nuevo estándar N3225 ... No es de extrañar que no pudiera encontrarlo. Creo que es un problema de diferentes personas que tratan con diferentes partes y no pensaron demasiado en los problemas de consistencia. . – user534498

1

(. En primer lugar, lo siento por mi Inglés correcciones son absolutamente Wellcome)

La norma dice:

§5.7-3 El resultado del operador binario + es la suma de los operandos . [...]

Supongamos que tenemos la expresión e1 + e2, y el operador + seleccionada es la incorporada en uno, está bien formado la expresión, e1 y e2 son tipos aritméticos o una pieza de fundición de tipo aritmético está disponible, y todo está bien, bien y perfecto!

Por lo tanto, se aplica la regla §5.7-3. En otra parte, cada uno operando es un expresiones:

§5-1 [Nota : [...] Una expresión es una secuencia de operadores y operandos que especifica un cálculo. Una expresión puede generar un valor y puede causar efectos secundarios.- finales nota]

Se dice que una expresión puede resultado en un valor debido a void expresiones, como la expresión delete o una función void, pero como hemos dicho e1 + e2 es una expresión definida perfectamente! , podemos omitir el verbo "puede", y entonces podemos afirmar que: una expresión da como resultado un valor.

Último punto: para los operadores incorporados aritméticos y lógicos, entiendo, aunque no está especificado por la norma, solo importa el valor de sus operandos, independientemente de la categoría de valor de los mismos.

Creo que con las expresiones es suficiente para implementar el operador integrado + (y otros operadores aritméticos), ya que solo el valor importa, y el valor se puede alcanzar a través de la expresión. Por esta razón, el Estándar no los define claramente.

De todos modos, este tipo de cosas están muy mal estructuradas. Por ejemplo, no he encontrado ningún lugar que especifique, cuando un operador recibe un objeto como operando y no un valor directo (duda que estoy tratando de resolver), si el operador debe tomar directamente su valor para calcular el operador, si el valor es el resultado de evaluar el objeto, y así sucesivamente. Es obvio que solo importan los valores, pero lo que dice exactamente el Estándar para estas cosas es una especie de misterio.

Cuestiones relacionadas