Насколько мне известно, код 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
, и это нормально (примечание: порядок вычисления аргументов функции не указан).