Здравствуйте, nen777w, Вы писали: N>A a; N>++a; //вполне законно N>a++; //??? MSVC 2005 N>[/ccode]
это 2 разных оператора (2 разные функции) — преинкремент и постинкремент
соответственно, у них разные сигнатуры, (какие не помню на память)
Здравствуйте, nen777w, Вы писали:
RTT>>это 2 разных оператора (2 разные функции) — преинкремент и постинкремент
N>Я как бы в курсе. Вопрос почему вызывается оператор пре-инкримента N>
N>void operator++() {}
N>для пост-инкремента N>
N>a++; //??? MSVC 2005
Компилятор по-умолчанию не предоставляет эти операторы.
Ты определил оператор преинкремента — вот он и компилируется.
А а оператор постинкремента ты не определил — вот компилятор и возмущается.
RTT> RTT>Компилятор по-умолчанию не предоставляет эти операторы. RTT>Ты определил оператор преинкремента — вот он и компилируется. RTT>А а оператор постинкремента ты не определил — вот компилятор и возмущается.
насколько я понял топикстартера, он возмущается именно тем, что у него этот кот компилируется
D>>насколько я понял топикстартера, он возмущается именно тем, что у него этот кот компилируется
RTT>для тех кто в танке (т.е. плохо читал мой первый ответ): RTT>ОПРЕДЕЛИ В СВОЕМ КЛАССЕ ОПЕРАТОР _ПОСТИНКРЕМЕНТА_ — и все будет компилироваться
RTT>СИГНАТУРА ОПЕРАТОРА ПОСТИНКРЕМЕНТА ОТЛИЧАЕТСЯ ОТ СИГНАТУРЫ ОПЕРАТОРА ПРЕИНКРЕМЕНТА — ПОТОМУ ЧТО ЭТО 2 РАЗНЫХ МЕТОДА
RTT>не знаю как еще понятней объяснить
в танке пока что ты. Шлемофон не жмет?
Топикстартер НЕ спрашивал почему этот код НЕ компилируется. Он спрашивает почему у него он КОМПИЛИРУЕТСЯ.
можно сказать, что с ключиком /Za предупреждение C4620 об отсутствии постфиксной формы operator++ превращается в ошибку C2676 (использовал VS2010, полагаю, что и VS2005 сделает то же самое).
M>Это не баг, а расширение, причём требование стандарта выдавать диагностическое сообщение соблюдено.
Вообще ИМХО странно.
Т.е. в стандарте так: для только перегруженного оператора пре-инкремента (void operator++()) он будет вызываться и для пре (++a) и для пост (a++),
а вот наоборот (для только перегруженного пост-инкремента (void operator++(int) ) компилятор будет орать об ошибке для пре-инкремента (++a)?
Не видно что то логики.