Если у меня есть пользовательский 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
,
Это синтаксис приведения.
Причина этого заключается в том, что приведение и унарное сложение, вычитание и умножение (оператор разыменования) имеют более высокий приоритет, чем их двоичные аналоги. Поскольку пробелы здесь не имеют значения, это также можно прочитать как:
A a = (A()) +A();
В ролях и unary+
имеют более высокий приоритет, чем двоичный operator+
поэтому выражение принимает прежнее значение.
Вам может быть интересно (как и я), как вы можете разыгрывать, когда вещь внутри не является типом. Войти САМЫЙ БЫСТРЫЙ ПАРСЕ!, что означает, что я пытаюсь разыграть объект типа +A()
к функции, принимающей 0 аргументов и возвращающей объект типа A
,
Для записи, синтаксис:
A a = ((A())) + A();
дает то, что вы хотите, так как двойные скобки не могут быть приведением, и мы вернулись к анализу двоичного operator+
выражение.
Это также объясняет, почему проблема не возникает с оператором деления вместо сложения, у него нет унарного аналога.
Других решений пока нет …