2011-10-18 4 views
1

У меня есть собственный класс MyInt, инкапсулирующий int m_nValue данных. Постфиксная операторОператор приращения постфикса

MyInt operator++(int) 
{ 
    MyInt temp(*this); 
    ++(*this); 
    return temp; 
} 

если оператор возвращает объект, то почему я не может назвать постфикс оператора ++ более чем один раз, как:

MyInt value(10); 
value++; // valid 
value++++; // Why is this invalid?? Cant it be interpreted as (value++)++ 

Почему значение ++++ выдает ошибку именующих необходимую если я могу вызвать метод value.print(), определенный в MyInt Class, тогда я также должен был бы делать значение ++++?

+0

С 'Int x',' 'х ++ также возвращает' int';) – delnan

+0

@delnan да я попробовал это тоже. но поскольку я могу вызывать методы возвращаемого значения, я думал, что снова могу использовать ++ как метод. Что делает постфиксный оператор другим, что я могу вызвать метод для возвращаемого значения, но я не могу использовать postfix ++ более одного раза? – Abhinav

+0

Я думаю, что реальный вопрос заключается в том, почему приращение постфикса требует lvalue ... –

ответ

5

Неправильный ответ:

Поскольку value++ временная переменная, которая содержит старое значение value. Вы не можете ++.

Вы также не можете написать 15++! Это похоже. Первая - временная переменная, более поздняя - константа, ни одна из которой вы не можете увеличить.

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

Во-первых, я не говорю, что константы и временные объекты - это одна и та же концепция. Я просто пытался сказать, что временные объекты не являются значениями l, как константы, но не используют слово l-значение.

О value++++, это не ошибка. Я просто тестировал его с помощью g ++ 4.5, и он отлично работает. В других ответах вы можете прочитать:

Из раздела 3.10.10 стандарта 2003:

Именующее выражение для объекта необходимо для того, чтобы изменить объект, за исключением, что Rvalue типа класса может также можно использовать для изменения своего референта при определенных обстоятельствах. [Пример: функция-член, вызываемая для объекта (9.3), может изменять объект. ]

Что неотъемлемо неправильно о том, что вы делаете это:

Скажем value держит 10. Первый value++ изменяет value на 11, но возвращает временный объект, содержащий 10. Затем вы получите ++, который изменяет временное значение (которое вы никогда не получаете) до 11, но снова возвращает временный объект, который содержит 10. Итак, value++++ ведет себя точно так же, как value++, за исключением того, что он делает ненужную работу.

+0

Я представляю мир, в котором люди будут писать значение +++++++++++. Ужас! –

+2

Ну, но значение '+++++++++++' прекрасно ... – TonyK

+0

Да, потому что, когда вы пишете' ++ value', вы меняете сами переменную 'value' и возвращаете ссылку на нее , Тогда это не временная переменная. Если вы не вернете ссылку, то значение '++++++++++++ 'также невозможно. – Shahbaz

4

Собственно, это should work. Этот оператор в основном является просто нормальной функцией-членом с причудливым синтаксисом, и поэтому вы можете вызвать его на rvalue.

Из раздела 3.10.10 стандарта 2003:

Именующее выражение для объекта необходимо для того, чтобы изменить объект за исключением того, что Rvalue типа класса также может быть использовано для изменения его референта при определенных обстоятельствах. [Пример: функция-член , вызываемая для объекта (9.3), может изменять объект. ]

+0

ну, это ошибка для меня. g ++ 4.2.1 darvin MacOSX – Abhinav

+4

Я хотел бы отметить, что, хотя он должен работать, он также не должен работать.Id est, он должен компилироваться, но он не должен увеличивать 'значение' дважды. (Он увеличивает значение «значение» один раз, а затем увеличивает временное значение, которое возникает из 'value.operator ++ (0)'. Конечный результат такой же, как 'value ++'). –

Смежные вопросы