Re[5]: operator ++/-- и MSVC - bug???
От: RikkiTikkiTavi Россия  
Дата: 03.06.10 16:03
Оценка: -7
D>насколько я понял топикстартера, он возмущается именно тем, что у него этот кот компилируется

для тех кто в танке (т.е. плохо читал мой первый ответ):
ОПРЕДЕЛИ В СВОЕМ КЛАССЕ ОПЕРАТОР _ПОСТИНКРЕМЕНТА_ — и все будет компилироваться

СИГНАТУРА ОПЕРАТОРА ПОСТИНКРЕМЕНТА ОТЛИЧАЕТСЯ ОТ СИГНАТУРЫ ОПЕРАТОРА ПРЕИНКРЕМЕНТА — ПОТОМУ ЧТО ЭТО 2 РАЗНЫХ МЕТОДА

не знаю как еще понятней объяснить
Re[6]: operator ++/-- и MSVC - bug???
От: dilmah США  
Дата: 03.06.10 16:23
Оценка: 1 (1) +2 :)
D>>насколько я понял топикстартера, он возмущается именно тем, что у него этот кот компилируется

RTT>для тех кто в танке (т.е. плохо читал мой первый ответ):

RTT>ОПРЕДЕЛИ В СВОЕМ КЛАССЕ ОПЕРАТОР _ПОСТИНКРЕМЕНТА_ — и все будет компилироваться

RTT>СИГНАТУРА ОПЕРАТОРА ПОСТИНКРЕМЕНТА ОТЛИЧАЕТСЯ ОТ СИГНАТУРЫ ОПЕРАТОРА ПРЕИНКРЕМЕНТА — ПОТОМУ ЧТО ЭТО 2 РАЗНЫХ МЕТОДА


RTT>не знаю как еще понятней объяснить


в танке пока что ты. Шлемофон не жмет?
Топикстартер НЕ спрашивал почему этот код НЕ компилируется. Он спрашивает почему у него он КОМПИЛИРУЕТСЯ.
operator ++/-- и MSVC - bug???
От: nen777w  
Дата: 03.06.10 14:42
Оценка: 32 (1)
Почему этот код компилируется, ещё и оператор вызывается?

class A{
  public:
    void    operator++() {}
};

A a;
++a; //вполне законно
a++; //??? MSVC 2005



03.06.10 23:46: Перенесено модератором из 'C/C++. Прикладные вопросы' — Кодт
Re[7]: operator ++/-- и MSVC - bug???
От: RikkiTikkiTavi Россия  
Дата: 03.06.10 16:33
Оценка: 32 (1)
D>в танке пока что ты. Шлемофон не жмет?

гы! затупил

все понятно
вот что выдала 2005я студия у меня
: warning C4620: no postfix form of 'operator ++' found for type 'A', using prefix form
: see declaration of 'A'

типа, компилятор "достаточно умен"

включи уровень варнингов построже, и, думаю, 2008 студия то же выдаст
Re: operator ++/-- и MSVC - bug???
От: RikkiTikkiTavi Россия  
Дата: 03.06.10 15:19
Оценка:
Здравствуйте, nen777w, Вы писали:
N>A a;
N>++a; //вполне законно
N>a++; //??? MSVC 2005
N>[/ccode]
это 2 разных оператора (2 разные функции) — преинкремент и постинкремент
соответственно, у них разные сигнатуры, (какие не помню на память)
Re[2]: operator ++/-- и MSVC - bug???
От: nen777w  
Дата: 03.06.10 15:26
Оценка:
RTT>это 2 разных оператора (2 разные функции) — преинкремент и постинкремент

Я как бы в курсе. Вопрос почему вызывается оператор пре-инкримента

void operator++() {}


для пост-инкремента

a++; //??? MSVC 2005


?
Или Я что то не понял.

RTT>соответственно, у них разные сигнатуры, (какие не помню на память)


void operator++(int) <-постфиксная форма т.е. для obj++;
void operator++() <-префиксная форма т.е. для ++obj;
Re[3]: operator ++/-- и MSVC - bug???
От: RikkiTikkiTavi Россия  
Дата: 03.06.10 15:46
Оценка:
Здравствуйте, nen777w, Вы писали:

RTT>>это 2 разных оператора (2 разные функции) — преинкремент и постинкремент


N>Я как бы в курсе. Вопрос почему вызывается оператор пре-инкримента

N>

N>void operator++() {}


N>для пост-инкремента

N>

N>a++; //??? MSVC 2005



Компилятор по-умолчанию не предоставляет эти операторы.
Ты определил оператор преинкремента — вот он и компилируется.
А а оператор постинкремента ты не определил — вот компилятор и возмущается.
Re[4]: operator ++/-- и MSVC - bug???
От: dilmah США  
Дата: 03.06.10 15:59
Оценка:
RTT>
RTT>Компилятор по-умолчанию не предоставляет эти операторы.
RTT>Ты определил оператор преинкремента — вот он и компилируется.
RTT>А а оператор постинкремента ты не определил — вот компилятор и возмущается.

насколько я понял топикстартера, он возмущается именно тем, что у него этот кот компилируется
Re: operator ++/-- и MSVC - bug???
От: Aznog Россия  
Дата: 03.06.10 16:52
Оценка:
Здравствуйте, nen777w, Вы писали:

N>Почему этот код компилируется, ещё и оператор вызывается?


N>
N>class A{
N>  public:
N>    void    operator++() {}
N>};

N>A a;
N>++a; //вполне законно
N>a++; //??? MSVC 2005

N>


Дополняя следующий ответ
Автор: RikkiTikkiTavi
Дата: 03.06.10
можно сказать, что с ключиком /Za предупреждение C4620 об отсутствии постфиксной формы operator++ превращается в ошибку C2676 (использовал VS2010, полагаю, что и VS2005 сделает то же самое).
Re: Нарушения стандарта C++ здесь нет
От: Masterkent  
Дата: 03.06.10 20:50
Оценка:
Это не баг, а расширение, причём требование стандарта выдавать диагностическое сообщение соблюдено.
Re[2]: Нарушения стандарта C++ здесь нет
От: nen777w  
Дата: 04.06.10 07:59
Оценка:
M>Это не баг, а расширение, причём требование стандарта выдавать диагностическое сообщение соблюдено.

Вообще ИМХО странно.
Т.е. в стандарте так: для только перегруженного оператора пре-инкремента (void operator++()) он будет вызываться и для пре (++a) и для пост (a++),
а вот наоборот (для только перегруженного пост-инкремента (void operator++(int) ) компилятор будет орать об ошибке для пре-инкремента (++a)?
Не видно что то логики.
Re[3]: Нарушения стандарта C++ здесь нет
От: Masterkent  
Дата: 04.06.10 08:32
Оценка:
N>Т.е. в стандарте так:

Не в стандарте, а у VC++. Стандарт же разрешает любые расширения на условиях, описанных в 1.4/8
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.