Нет, часть 2 не в порядке.
Специфической частью стандарта является 6.7.3.1/4.Этот раздел довольно плотный и требует нескольких повторных чтений, но P - ограничительный указатель, а X - некоторый объект, к которому он используется, и который изменяется.Итак, в вашем примере P равно fooPtr
, а X равно foo
.Тогда:
Каждое другое значение lvalue, используемое для доступа к значению X, также должно иметь свой адрес на основе P.
"на основе" определено в предыдущем абзаце,Подводя итог, можно сказать, что lvalue foo
не не имеет свой адрес, основанный на ограничивающем указателе P. Таким образом, правило нарушается при доступе к объекту foo
через его собственное имя.* Часть 3 не в порядке по той же причине, lvalue *fooPtr2
также не основана на P, но также используется для доступа к X.
Я говорю «не в порядке» - если быть точным,комбинация 1 + 2 вызывает неопределенное поведение, как и комбинация 1 + 3.Пока вы на самом деле не обращаетесь к объекту через указатель restrict, ни одно из определений restrict не запускается.Если вы хотите, вы можете удалить часть 1, сохранить неиспользованный ограничительный указатель, и тогда 2 и 3 будут в порядке.