studio reales proyectos programacion libro introducción incluye herramientas fundamentos fuente español código con avanzado aplicaciones c++ operator-overloading initializer-list

c++ - reales - libro de android studio en español pdf



¿Por qué puedo usar las listas de inicialización en el lado derecho del operador+= pero no el operador+? (3)

C ++ 14 §5.17 / 9:

Puede aparecer una lista de inicio en el lado derecho de

  • una asignación a un escalar, en cuyo caso la lista de inicializadores tendrá, como máximo, un solo elemento. El significado de x={v} , donde T es el tipo escalar de la expresión x , es el de x=T{v} . El significado de x={} es x=T{} .
  • una asignación a un objeto de tipo de clase, en cuyo caso la lista de inicializadores se pasa como argumento a la función de operador de asignación seleccionada por resolución de sobrecarga (13.5.3, 13.3).

Esto se aplica a a += b a través de su equivalencia de $ 5.7 / 7 a a = a + b (excepto que a se evalúa solo una vez para += ). Dicho de otra manera, debido a un comentario de MM, debido a la equivalencia para los operadores integrados, += se considera un operador de asignación y no un operador de actualización especial. Por lo tanto, el texto citado sobre "asignación" se aplica a += .

Este es un seguimiento de una pregunta anterior sobre por qué no puedo usar un inicializador con corchetes como un argumento para el operator+ , que se resolvió mirando esta pregunta anterior sobre el tema .

Considere el siguiente código C ++, que puede probar en vivo en ideone.com :

#include <iostream> #include <initializer_list> using namespace std; struct AddInitializerList { void operator+= (initializer_list<int> values) { // Do nothing } void operator+ (initializer_list<int> values) { // Do nothing } }; int main() { AddInitializerList adder; adder += {1, 2, 3}; // Totally legit adder + {1, 2, 3}; // Not okay! return 0; }

La línea en main que usa operator+ con una lista de inicializadores entre corchetes no se compila (y, después de hacer esa pregunta anterior, ahora sé por qué es esto). Sin embargo, estoy confundido de por qué el código que usa opeartor+= en main realmente compila bien.

Estoy confundido en cuanto a la razón por la que puedo sobrecargar += y hacer que funcione bien, mientras que la sobrecarga + no parece funcionar aquí. ¿Hay alguna disposición en la norma que permita los inicializadores entre corchetes en el contexto del operador += pero no el operador + ? ¿O es esto solo una extraña peculiaridad del compilador?


Se explica en la respuesta a esta pregunta (que está vinculada a la pregunta a la que está vinculado).

La gramática del lenguaje solo permite una lista preparada en ciertos contextos gramaticales, no en lugar de una expresión arbitraria. Esa lista incluye el lado derecho de los operadores de asignación, pero NO el lado derecho de los operadores en general.

+= es un operador de asignación, + no es.

La gramática para expresiones de asignación es:

assignment-expression: conditional-expression logical-or-expression assignment-operator initializer-clause throw-expression assignment-operator: one of = *= *= /= %= += -= >>= <<= &= ^= |=


+= operador es una asignación compuesta . El estándar permite explícitamente las listas de inicialización en el lado derecho de las tareas:

§8.5.4 / 1 [...] Nota: se puede usar la inicialización de lista

...

- en el lado derecho de una tarea (5.17)

§5.17 habla sobre todas las tareas, incluidas las compuestas:

Asignación-expresión:
- expresión condicional
- cláusula-inicializador- operador -lógica-o-expresión
- expresión de lanzamiento

asignación-operador: uno de
= *= /= %= += -= >>= <<= &= ˆ= |=