Pregunta Error al llamar operador + definido por el usuario en objeto temporal cuando hay corchetes adicionales


Si tengo un usuario definido 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 el (A()) está siendo ignorado 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 lo hice #define X (Identity()) y luego intenté X + X.


32
2018-05-20 03:20


origen


Respuestas:


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 unary+ tener mayor prioridad que el binario operator+ entonces 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. Entrar ¡LA PAREJA MÁS VENTILADORA!, lo que significa que estoy tratando de lanzar un objeto de tipo +A() a 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 vuelta a analizar el binario operator+ expresión.

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.


46
2018-05-20 03:53