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

Если у меня есть пользовательский 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,

32

Решение

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

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

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

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

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

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

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

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

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

46

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]