Pregunta

El operador de comas garantiza la orden de evaluación de izquierda a derecha.

[n3290: 5.18/1]: Los grupos de operadores de coma de izquierda a derecha.

expression:
   assignment-expression
   expression , assignment-expression

Se evalúa un par de expresiones separadas por una coma de izquierda a derecha; La expresión izquierda es una expresión de valor descartada (cláusula 5). Cada cálculo de valor y efecto secundario asociados con la expresión izquierda se secuencia antes de cada cálculo de valor y efecto secundario asociados con la expresión correcta. El tipo y el valor del resultado son el tipo y el valor del operando correcto; El resultado es de la misma categoría de valor que su operando derecho, y es un campo de bits si su operando derecho es un glvalú y un campo de bits.

La única otra cláusula con respecto al operador no menciona la orden de evaluación. Por lo tanto, parece que este sigue siendo el caso cuando el operador ha sido sobrecargado.

Pero luego, más arriba, en el Spiel General con respecto a las expresiones, por supuesto, se afirma que las reglas cambian cuando sobrecarga a los operadores:

[n3290: 5/2]: [ Nota: Los operadores se pueden sobrecargar, es decir, un significado dado cuando se aplica a expresiones de tipo de clase (cláusula 9) o tipo de enumeración (7.2). Los usos de los operadores sobrecargados se transforman en llamadas de funciones como se describe en 13.5. Los operadores sobrecargados obedecen las reglas para la sintaxis especificadas en la cláusula 5, pero los requisitos del tipo de operando, la categoría de valor y la orden de evaluación son reemplazados por las reglas para la llamada de función. Relaciones entre operadores, como ++asentido a+=1, no están garantizados para operadores sobrecargados (13.5), y no están garantizados para operandos de tipo bool. —En nota ]

Sin embargo, esto es no normativo texto. Hay alguna normativo ¿Texto que define esta regla, o podría un compilador que lo compleja ignorarlo?

¿Fue útil?

Solución

Solo tengo el estándar 03 a mano, pero en él 5/3 dice "La cláusula 5 define los efectos de los operadores cuando se aplica a los tipos para los que no se han sobrecargado".

Entonces, toda la cláusula 5, incluida 5.18/1, solo se aplica a los operadores incorporados y no a ninguna función sobrecargada.

(Un compilador compatible siempre podría evaluar los operandos a una sobrecarga operator ,() Sin embargo, de izquierda a derecha).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top