Не определен ли результат косвенного изменения одного и того же значения дважды за оператор? - PullRequest
1 голос
/ 03 августа 2020

Насколько мне известно, код C ++, например foo(++i, ++i), дает неопределенное поведение, потому что он мутирует i дважды за «точку последовательности» (кстати, какой новый термин для этого?). Но что, если то же самое произойдет косвенно? Вот пример:

#include <iostream>

unsigned nextId = 0;
struct IdOwner {
  unsigned id;
  IdOwner() : id(nextId++) {} // mutates nextId
};

void test(IdOwner one, IdOwner two) {
  std::cout << one.id << " " << two.id << std::endl; // just observing
}

int main() {
  test(IdOwner{}, IdOwner{}); // indirectly mutates nextId twice per statement
}

Вызывает ли этот вызов test() неопределенное поведение? Для меня он печатает 1 0, и это нормально (примечание: порядок вычисления аргументов функции не указан).

1 Ответ

4 голосов
/ 03 августа 2020

Порядок оценки аргументов функции не указан. В этом вызове:

test(IdOwner{}, IdOwner{});

объекты 2 IdOwner могут быть оценены в любом порядке, но оба будут оцениваться перед вызовом test. Таким образом, программа могла печатать 0 1 или 1 0.

...