1. ホーム
  2. c++

[解決済み] 非型式テンプレートパラメータ

2023-01-25 15:31:08

質問

非型のテンプレートパラメータは定数積分式であるべきだと理解しています。なぜそうなるのか、どなたか教えてください。

template <std::string temp>
void foo()
{
     // ...
}

<ブロッククオート
error C2993: 'std::string' : illegal type for non-type template parameter 'temp'.

定数積分式がどういうものかは理解できました。のような定数でない型が許されない理由は何ですか? std::string のような定数でない型を許さない理由は何ですか?

どのように解決するのですか?

これができない理由は、定数でない式はコンパイル時に解析して代入することができないからです。それらは実行時に変更される可能性があり、それには実行時に新しいテンプレートを生成する必要がありますが、テンプレートはコンパイル時の概念であるため、それは不可能なのです。

以下は、標準が非タイプのテンプレートパラメータに対して許可しているものです(14.1 [temp.param] p4)。

非タイプのテンプレートパラメータは、以下の(オプションでcv-qualified)タイプのうちの1つを持たなければならない。

  • 整数型または列挙型.
  • オブジェクトへのポインタ、または関数へのポインタ。
  • オブジェクトへのlvalueの参照、または関数へのlvalueの参照。
  • メンバーへのポインタ。
  • std::nullptr_t .