c++ - sirve - Error al llamar operador+definido por el usuario en objeto temporal cuando hay corchetes adicionales
para que sirve el punto y coma en c++ (1)
Es una sintaxis de elenco.
La razón de esto es que el casting y la suma, resta y multiplicación unarias (el operador de desreferencia) tienen mayor precedencia que sus contrapartes binarias. Como los espacios en blanco aquí no importan, esto también se puede leer como:
A a = (A()) +A();
El elenco y el unary+
tienen mayor prioridad que el operator+
binario operator+
por lo que la expresión toma el significado anterior.
Tal vez se pregunte (como lo hice) cómo puede lanzar cuando lo que está dentro no es un tipo. ¡Ingrese LA PARE MÁS VENTILADA! , lo que significa que estoy tratando de convertir un objeto de tipo +A()
en una función que toma 0 argumentos y devuelve un objeto de tipo A
Para el registro, la sintaxis:
A a = ((A())) + A();
da lo que quieres ya que los corchetes dobles no pueden ser un yeso y estamos de nuevo analizando la expresión operator+
binario.
Esto también explica por qué el problema no ocurre con el operador de división en lugar de la suma, no tiene una contraparte única.
Si tengo un operator+()
definido por el usuario operator+()
como en:
class A
{
public:
A operator+(A)
{
return A();
}
};
Entonces, el siguiente funciona como se espera:
A a = A() + A();
pero g ++ - 4.7 da un mensaje de error sobre lo siguiente:
A a = (A()) + A();
El mensaje de error en particular es error: no match for ''operator+'' in ''+A()''
.
Parece que se está ignorando (A())
en la expresión.
Mi pregunta es: ¿es A a = (A()) + A();
se supone que compilará y si no, ¿por qué no?
Nota: esto me sucedió cuando #define X (Identity())
y luego intenté con X + X