В C ++ 17 должен ли этот код выдавать предупреждения?

Как видно на этой ссылке

clang в режиме C ++ 14 (но не в C ++ 17) и GCC в режиме C ++ 17 выдают предупреждения о последовательности. Я предположил, что в C ++ 17 все вещи в правой части = оцениваются до lhs, поэтому я не уверен, правильно ли предупреждение gcc.

Code is:
static int index =0; 
void f(int* pindex){
        pindex[index] = 5;
        pindex[index] = index++;

}
int main(){

}

Предупреждение gcc:

: In function 'void f(int*)':
:4:30: warning: operation on 'index' may be undefined [-Wsequence-point]
4 |         pindex[index] = index++;

  |                         ~~~~~^~
:4:30: warning: operation on 'index' may be undefined [-Wsequence-point]

Компилятор вернул: 0

примечание: я знаю, что в стандарте ничего не говорится о предупреждениях, просто гораздо проще задать вопрос относительно предупреждений, чем говорить о гарантиях точки последовательности / порядка.


person NoSenseEtAl    schedule 07.07.2020    source источник
comment
Этот точный пример указан в cppreference как неопределенное поведение до C ++ 17. Кажется, вы правы, что предупреждение gcc неверно.   -  person super    schedule 07.07.2020
comment
pindex[index++] = index; выдает такое же предупреждение   -  person darune    schedule 07.07.2020


Ответы (1)


Этот код мог выдавать предупреждения до C ++ 17, где это было неопределенное поведение, но не должно быть с C ++ 17 или более поздней версии, когда поведение стало определенным:

  1. В каждом простом выражении присваивания E1=E2 и каждом составном выражении присваивания E1@=E2 каждое вычисление значения и побочный эффект E2 упорядочиваются перед каждым вычислением значения и побочным эффектом E1 (начиная с C ++ 17)

(Источник)

Предупреждение GCC - это ошибка. (Надеюсь, это единственная ошибка, и GCC на самом деле не рассматривает этот случай как UB.)

person cdhowie    schedule 07.07.2020
comment
принято, но эта ссылка cppreference была бесполезна для меня, я просто не могу разобрать весь этот условный язык ... Я хотел бы выбрать языковую версию, чтобы мне не приходилось разбирать if в моей голове, пытаясь учиться. :) - person NoSenseEtAl; 07.07.2020
comment
Ну поэтому и процитировал соответствующий раздел. - person cdhowie; 07.07.2020