Примечание. Чтобы уточнить, вопрос касается не использования ключевого слова restrict
в целом, а конкретно его применения к функциям-членам, как описано здесь.
gcc позволяет вам использовать квалификатор __restrict__
(эквивалент GNU++ для C99 restrict
) в функции-члене, фактически делая this
ограниченным квалифицированным указателем в пределах области действия функции. Где говядина?
Большинство функций-членов работают с другими членами, обращаясь к ним через this
, который является T* const
(и обычно без псевдонимов). Чтобы this
мог иметь псевдоним, в функции-члене должен был бы каким-то образом использоваться второй указатель на тип, и он должен откуда-то исходить.
Это ситуация, которая обычно имеет место с не -функции-члены, такие как, например, все бинарные операторы или любая другая свободная функция, которая принимает как минимум два указателя или ссылки идентичного нетривиального типа. Однако у этих функций нет this
, поэтому они не имеют значения.
Оператор присваивания, конструктор копирования и операторы унарного сравнения являются примерами функций-членов, где this
могло бы в принципе быть псевдонимом (поскольку другой объект передается по ссылке). Таким образом, действительно имеет смысл назначать квалификатор ограничения только для них - для компилятора уже должно быть очевидно, что все остальные функции в любом случае имеют свойство ограничения (потому что никогда не бывает второго указателя на-T).
Теперь, если, например, вы использовали restrict
для operator=
, вы должны соответственно вообще не проверять самоназначение, потому что вы говорите, что this
не является псевдонимом в рамках этой функции (и если это так, самоназначение не может произойти).
Очевидно, это то, что вы не можете знать заранее, и это также не имеет смысла.
Итак, что может быть в случае, когда на самом деле нужно дать функции-члену квалификатор ограничения и где это имеет смысл?
this
- на самом деле это не непрерывный массив одного и того же типа? - person Anycorn   schedule 24.07.2011