Примечание: Чтобы уточнить, речь идет не об использовании restrict
ключевого слова в целом, но конкретно о его применении к функциям-членам, как описано here.ограничить спецификатор на функции-члены (ограничить этот указатель)
GCC позволяет использовать __restrict__
(ГНУ ++ эквивалент restrict
C99) в классификаторе на функции-члена, эффективно делая this
ограничение квалифицированного указателя в пределах области видимости функции. Где говядина?
Большинство функций-членов работают с другими членами, обращаясь к ним через this
, что является T* const
(и обычно неустановленным). Для того, чтобы this
был, возможно, псевдонимом, в какой-то мере должен был использоваться второй указатель на тип в функции-члене, и он должен был откуда-то исходить.
Это ситуация, которая регулярно встречается с функциями, не являющимися членами, такими как, например, все двоичные операторы или любая другая свободная функция, которая принимает по крайней мере два указателя или ссылки одинакового нетривиального типа. Однако эти функции не имеют this
, поэтому они не актуальны.
Оператор присваивания, конструктор копирования, и унарные операторы сравнения приведены примеры функций-членов, где this
может быть в принципе псевдонимами (так как другой объект передается с помощью ссылки). Поэтому на самом деле имеет смысл назначить для них классификатор ограничений - для компилятора уже должно быть очевидно, что все остальные функции имеют свойство ограничения в любом случае (потому что никогда не существует второго указателя на Т).
Теперь, если, например, вы использовали restrict
на operator=
вы должны последовательно не проверить для самостоятельного присвоения на всех, потому что вы говорите, что this
не псевдонимы в рамках этой функции (и , если это правда, самообслуживание не может произойти).
Очевидно, это то, о чем вы не можете знать заранее, и это тоже не имеет смысла.
Итак, что было бы случаем, когда на самом деле нужно было бы дать функции-члену классификатора ограничений и где это имеет смысл?
Я не думаю, что это имеет смысл сделать это. Что именно вы бы сгладили с помощью 'this' - это не сплошной массив одного типа? – Anycorn
@Anycom: Если класс имеет элементы данных, любой совместимый указатель может быть псевдонимом элемента данных. – MSalters