非定数型のテンプレート パラメーターの制限について
C では、非型のテンプレート パラメーターは、テンプレートのインスタンス化を制御するという特定の目的を果たします。ただし、std::string などの特定の型が非型テンプレート パラメーターとして禁止されている理由を理解することが重要です。
C 標準によれば、非型テンプレート パラメーターは定数整数式 (14.1) である必要があります。 [temp.param] p4)。これは、実行時に値を変更できないことを意味します。逆に、std::string のような型は非定数であり、変更できます。
この制限の理由は、テンプレートの性質にあります。テンプレートはコンパイル時に処理およびインスタンス化されます。つまり、テンプレートの動作はプログラムの実行前に決定されます。非定数のテンプレート パラメーターを許可すると、値が実行時に変更される可能性があるため、あいまいさが生じます。
たとえば、次のコード スニペットでは、
template <std::string temp> void foo() { // ... }
temp の値は実行中に変更される可能性があります。そのため、コンパイル時に foo() の動作を判断することができなくなります。これにより、実行時のオーバーヘッドが発生し、コンパイル時にコードを生成することで効率を高めるというテンプレートの目的が損なわれることになります。
そのため、C 標準では、型以外のテンプレート パラメーターを定数の整数式に制限し、次のことが保証されています。それらの値はコンパイル プロセスを通じて一定のままです。これにより、テンプレートでコード生成を最適化し、予測可能な動作を維持できるようになります。
以上がC で非型テンプレート パラメーターとして `std::string` を使用できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。