El estándar define la suma generalizar como sigue: numeric.defns
Definir GENERALIZED_NONCOMMUTATIVE_SUM (op, a1, ..., an) de la siguiente manera:
a1 cuando N es 1, de lo contrario
op (GENERALIZED_NONCOMMUTATIVE_SUM (op, a1, ..., ak), OP (GENERALIZED_NONCOMMUTATIVE_SUM (op, AM, ..., an)) para cualquier K, donde 1
Definir GENERALIZED_SUM (op, a1, ..., an) como GENERALIZED_NONCOMMUTATIVE_SUM (op, B1, ..., Bn), donde b1, ..., Bn puede ser cualquier permutación de a1, ..., an.
Por lo tanto, el orden de adición, así como el orden de los operandos es no especificado. Así que si la operación binaria no es conmutativo o no asociativo, el resultado es indeterminado.
Esto también se dijo explícitamente aquí .
En cuanto a por qué: Da la biblioteca de los proveedores más libertad, por lo que pueden o no pueden ponerlo en práctica mejor. Como un ejemplo donde la aplicación se puede beneficiar de conmutatividad. Considere la suma a+b+c+d+e
, primero calculamos a+b
y c+d
en paralelo. Ahora a+b
regresa antes c+d
hace (como puede suceder, ya que se hace en paralelo). En lugar de esperar a que el valor de retorno de la c+d
que ahora puede calcular directamente (a+b)+e
y luego agregar este resultado con el resultado de c+d
. Así que al final, hemos calculado ((a+b)+e)+(c+d)
, que es un reordenamiento de a+b+c+d+e
.