Ошибка вызова пользовательского оператора + для временного объекта при наличии дополнительных скобок

Если у меня есть пользовательский operator+() как в:

    class A
    {
    public:
        A operator+(A)
        {
            return A();
        }
    };

Тогда следующее работает как ожидалось:

    A a = A() + A();

но g++-4.7 выдает сообщение об ошибке следующего:

    A a = (A()) + A();

В частности, сообщение об ошибке error: no match for ‘operator+’ in ‘+A()’,
Похоже, (A()) игнорируется в выражении.

Мой вопрос: есть A a = (A()) + A(); должен компилироваться, а если нет, то почему нет?

Примечание: это случилось со мной, когда я сделал #define X (Identity()) а потом попытался сделать X + X,

1 ответ

Решение

Это синтаксис приведения.

Причина этого заключается в том, что приведение и унарное сложение, вычитание и умножение (оператор разыменования) имеют более высокий приоритет, чем их двоичные аналоги. Поскольку пробелы здесь не имеют значения, это также можно прочитать как:

    A a = (A()) +A();

В ролях и unary+ имеют более высокий приоритет, чем двоичный operator+ поэтому выражение принимает прежнее значение.

Вам может быть интересно (как и я), как вы можете разыгрывать, когда вещь внутри не является типом. Введите САМЫЙ ВЕСИНГОВЫЙ ПАРСЕ!, что означает, что я пытаюсь привести объект типа +A() к функции, принимающей 0 аргументов и возвращающей объект типа A,

Для записи, синтаксис:

    A a = ((A())) + A();

дает то, что вы хотите, так как двойные скобки не могут быть приведением, и мы вернулись к анализу двоичного operator+ выражение.

Это также объясняет, почему проблема не возникает с оператором деления вместо сложения, у него нет унарного аналога.

Другие вопросы по тегам