一般に、これは関数を使用不可にすることを意味します。たとえば、プログラムでの動的割り当ての使用を禁止したい場合は、malloc
関数を「汚染」して使用できないようにすることができます。
ビデオでは、彼はより具体的な方法でそれを使用しています。これは、「コンパイル時間のみを強制する方法はありますか?」と言っている関数の汚染について話しているときに表示されるスライドを読むと明らかです。
したがって、実行時に関数を呼び出し不可能にするために関数を「汚染」することについて話しているため、定数式でのみ呼び出し可能です。テクニックは、コンパイル時のコンテキストで呼び出されたときに決して実行されない関数内に分岐を持ち、その分岐にエラーの原因となるものを含めることです。
throw
式は限りそれは(あなたは、コンパイル時に例外をスローすることはできませんので、それはメモリを割り当てるように、本質的に動的な操作です)関数のコンパイル時の呼び出し中に到達されることはありませんよう、constexprの機能で許可されています。したがって、未定義のシンボルを参照するスロー式は、コンパイル時に呼び出されません(コンパイルに失敗するため)ため、実行時に使用できません。未定義のシンボルがリンカーエラーを引き起こすためです。
未定義のシンボルは、関数のコンパイル時の呼び出しでは「奇数使用」されないため、実際にはコンパイラーはシンボルへの参照を作成しないため、未定義であっても問題ありません。
役に立ちましたか?彼はそれを行う方法をデモンストレーションしていますが、それが良いアイデアであるか、広く役立つとは限りません。何らかの理由でそれを行う必要がある場合は、彼のテクニックが問題を解決する可能性があります。あなたがそれを必要としないなら、あなたはそれを心配する必要はありません。
これが役立つ理由の1つは、一部の操作のコンパイル時バージョンが効率が悪い場合です。constexpr関数で許可される式の種類には制限があります(特にC ++ 11では、C ++ 14で一部の制限が削除されました)。したがって、計算を実行するための関数の2つのバージョンがある可能性があります。1つは最適ですが、constexpr関数では許可されていない式を使用し、もう1つは有効なconstexpr関数ですが、実行時に呼び出されるとパフォーマンスが低下します。時間。次善のバージョンを汚染して、ランタイム呼び出しに使用されないようにして、より効率的な(constexpr以外の)バージョンがランタイム呼び出しに使用されるようにすることができます。
注意コンパイル時に使用されるconstexpr関数のパフォーマンスは、実行時のオーバーヘッドがないため、それほど重要ではありません。コンパイラーに余分な処理を行わせることでコンパイルを遅くする可能性がありますが、実行時のパフォーマンスコストは発生しません。