purepureTDPL が説明するように、単純な数学関数などを超えて有用であるにはあまりにも制限的であることが判明したため、TDPL のリリース以降、少し拡張されました。現在の定義についてはオンライン ドキュメントを参照できますが、基本的には次のようになります。
pure関数は、プログラムの過程で変更できるモジュールレベルまたは静的変数にアクセスできません (それらはconst値型であるかimmutable、関数からアクセスする必要がありpureます)。
pure関数は、そうでない関数を呼び出すことはできませんpure。
pure関数は I/O を実行できません。
それでおしまい。その他の制限はありません。ただし、関数がステートメント内で複数回使用されても 1 回だけ呼び出されるように関数を最適化する場合は、追加の制限が必要です。pureすなわち:
- 関数のパラメーターは、
immutableまたは暗黙的に に変換可能でなければなりませんimmutable。
理論的には、関数の引数がimmutable暗黙的に変換可能である必要があることを要求するように拡張できますimmutable(引数が指定されたときにパラメーターを持つ関数をconst最適化できるようにするためimmutable) が、現在はそうではありません。
このようなpure関数は "strongly" と呼ばれるpureことがありますが、最適化できない関数は "weakly" と呼ばれpureます。TDPL はpure機能を強力に記述します。より一般的に使用できるpureようにするために、weakly関数が追加されました。pure
弱いpure関数は引数を変更できますが、グローバル状態を変更することはできません。そのため、強力pureな関数 (引数を変更できないpure) によって呼び出された場合、強力な関数の戻り値が常に同じであることを保証します。引数はまだ保持されます。基本的に、weaklypure関数はグローバル状態を変更できないため、pure呼び出し元の strong 関数のプライベート状態の一部になります。したがって、関数のプライベート状態が拡張され、グローバル状態を変更せずにプライベート状態を変更できる関数を許可することを除いて、 Andrei がセクション5.11.1.1pureでpure説明していることと非常に一致しています。
TDPL に関して追加されたもう 1 つの重要な点pureは、関数属性の推論です。pure、nothrow、および@safeは、テンプレート化された関数に対して推論されます (通常の関数に対してではありません)。したがって、テンプレート化された関数がである場合pure、現在は です pure。その純度は、インスタンス化されたものによって異なります。これで、pureテンプレート化された関数で使用できるようになりましたが、以前は通常使用できませんでしたpure。でも作らないpureと関数で使えないpureので大問題でした。pure. 幸いなことに、属性の推論によって修正されるようになりました。テンプレート化された関数がインスタンス化時に上記のルールに従っている限り、それは と見なされpureます。