Почему myint++++ отлично компилируется с компилятором VS2008 и компилятором gcc 3.42?? Я ожидал, что компилятор скажет, что нужно lvalue, пример см. Ниже.
struct MyInt
{
MyInt(int i):m_i(i){}
MyInt& operator++() //return reference, return a lvalue
{
m_i += 1;
return *this;
}
//operator++ need it's operand to be a modifiable lvalue
MyInt operator++(int)//return a copy, return a rvalue
{
MyInt tem(*this);
++(*this);
return tem;
}
int m_i;
};
int main()
{
//control: the buildin type int
int i(0);
++++i; //compile ok
//i++++; //compile error :'++' needs l-value, this is expected
//compare
MyInt myint(1);
++++myint;//compile ok
myint++++;//expecting compiler say need lvalue , but compiled fine !? why ??
}
++++i;
неверно. - person MSalters   schedule 14.07.2011++++i
действительно неправильно? - person Oliver Charlesworth   schedule 14.07.2011i
дважды без промежуточной точки последовательности — это неправильно. - person MSalters   schedule 14.07.2011++i - ++i
, гдеoperator-
имеет два аргумента и не определено, какой (или, действительно, если есть) один из них оценивается первым. Но в++++i
есть только один аргумент++i
для внешнегоoperator++
, который должен быть полностью вычислен первым, чтобы внешнийoperator++
запустился. Оно не более неопределенно, чемstd::cout<<"1st"<<"2nd"
. (Это не обязательно относится к внутренним типам, гдеoperator++
не обязательно является реальной функцией.) - person leftaroundabout   schedule 14.07.2011++(++i)
действительно сначала оценивает внутренний(++i)
, но затем - без точки следования - снова изменяет тот жеi
. Итак, мы знаем конкретный порядок оценки, и мы знаем, что это необходимо неправильно. - person MSalters   schedule 14.07.2011operator++
и до ввода внешнегоoperator++
. Это то, что я пытался сделать. - person leftaroundabout   schedule 14.07.2011operator++
для встроенных типов не является вызовом функции, поэтому перед ним или после него нет точки следования. @Martin: Армен прав: если это класс POD,++
- это вызов функции с точками последовательности до и после. - person MSalters   schedule 15.07.2011