Если мы имеем функцию:Почему компилятор не генерирует предупреждение или ошибку, если некоторые ограничивающие указатели указывают на один и тот же объект?
void func(int *restrict a, int *restrict b, int *restrict c) {
*c = *a + *b;
}
В принципе, этот код может привести к некоторой погрешности:
int aa = 1;
func(&aa, &aa, &aa);
, потому что в func
, *a
*b
*c
будет тот же объект. Но почему этот код можно скомпилировать успешно?
Возможно, что «ничего плохого» вы подразумеваете «никаких нарушений ограничений». Это все еще неопределенное поведение. То же самое относится и к нарушению constness объекта, который также не является нарушением ограничения. – Sebivor
@undefinedbehaviour: Точно, существует различие между кодом, имеющим нарушение ограничений и неопределенным/неуказанным/реализацией, прежний требует, чтобы последняя версия компилятора не выполняла. –
Это не совсем так. См. Пример в 5.1.1.3p2. – Sebivor