++x++ не компилируется

Почему это выражение не компилируется?

++x++;

Ответы (3 шт):

Автор решения: Harry

Итак, приоритеты операторов. Постфиксный ++ имеет более высокий приоритет, потому выполняется первым. Но он, увы, дает rvalue - к которому префиксный оператор неприменим.

Поэтому нужны скобочки -

(++x)++

и все скомпилируется...

→ Ссылка
Автор решения: fool

Надо поставить скобки и будет работать:

#include <iostream>

int x;
int y = (++x)++;
auto& z = (std::cout << y);

int main() {}
→ Ссылка
Автор решения: Ildar

объяснение как работают префиксный и постфиксный операторы инкремента:

во первых, у постфиксного оператора выше приоритет чем у префиксного; постфиксный берет копию со старым значением и инкрементирует свое родное значение потом возвращает копию, которая является rvalue; префиксный возвращает сразу с увеличенным значением; логику этого можно увидеть в небольшом классе обертке над простым int c перегруженными операторами инкремента:

#include <iostream>

class Integer
{
private:
  int value;
public:
  Integer() :value(0) {};
  Integer(int value) { this->value = value; };

  // префиксная форма
  Integer& operator++() {
    ++value;
    return *this; 
  }

  // постфиксная форма
  Integer operator++(int) {
    Integer result = *this;
    ++value;
    return result;
  }

  friend std::ostream& operator<<(std::ostream& out, const Integer& integer) {
    out << integer.value;
    return out;
  }
};


int main()
{
  Integer x = 0;

  std::cout << ++x << '\n'; // 1 
  std::cout << x++ << '\n'; // 1
  std::cout << x << '\n';   // 2

  std::cout << (++x)++ << '\n'; // 3
  std::cout << x << '\n';       // 4

  return 0;
}
→ Ссылка