++x++ не компилируется
Почему это выражение не компилируется?
++x++;
Ответы (3 шт):
Итак, приоритеты операторов. Постфиксный ++ имеет более высокий приоритет, потому выполняется первым. Но он, увы, дает rvalue - к которому префиксный оператор неприменим.
Поэтому нужны скобочки -
(++x)++
и все скомпилируется...
Надо поставить скобки и будет работать:
#include <iostream>
int x;
int y = (++x)++;
auto& z = (std::cout << y);
int main() {}
объяснение как работают префиксный и постфиксный операторы инкремента:
во первых, у постфиксного оператора выше приоритет чем у префиксного; постфиксный берет копию со старым значением и инкрементирует свое родное значение потом возвращает копию, которая является 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;
}