квалификатор restrict для функций-членов (ограничить этот указатель)

Примечание: Чтобы уточнить, вопрос не об использовании ключевого слова restrict в целом, а конкретно о применении его к функциям-членам, как описано здесь .

gcc позволяет использовать квалификатор __ restrict __ (GNU ++, эквивалентный C99 restrict ) для функции-члена, что фактически делает этим ограниченный указатель в области действия функции. В чем суть проблемы?

Большинство функций-членов работают с другими членами, обращаясь к ним через this , который является T * const (и обычно не имеет элиалита). Чтобы этот мог иметь псевдоним, в функции-члене каким-то образом должен был использоваться второй указатель на тип, и он должен был откуда-то исходить.
Это ситуация, которая обычно имеет место с функциями, не являющимися членами, такими как, например, все бинарные операторы или любая другая свободная функция, которая принимает по крайней мере два указателя или ссылки идентичного нетривиального типа. Однако эти функции не имеют this , поэтому они не имеют отношения к делу.

Оператор присваивания, конструктор копирования и унарные операторы сравнения являются примерами функций-членов, где this ] в принципе может иметь псевдоним (так как другой объект передается по ссылке). Так что действительно имеет смысл назначать им квалификатор restrict - компилятору уже должно быть очевидно, что все другие функции в любом случае имеют свойство restrict (потому что второго указателя на T никогда не бывает).

Теперь , если, например, вы использовали ограничить для operator = , вы должны , следовательно, вообще не проверять самоназначение, потому что вы говорите, что не имеет псевдонима в рамках этой функции (и , если это правда , самоприсвоение может произойти).
Очевидно, это то, о чем вы не можете знать заранее, и это то, что тоже не имеет смысла.

Итак, каков был бы случай, когда на самом деле нужно было бы дать функции-члену ограничительный квалификатор и где он имеет смысл?

5
задан Mat 2 August 2012 в 18:24
поделиться