Gccとclangでは、型以外のテンプレートパラメータの型句でdecltype(auto)
を使用できることがわかりました。例えば。:
template <decltype(auto)>
struct X {};
int foo ;
int main() {
X<(foo)> x;
static_cast<void>(x);
}
[live demo gcc][live demo clang]
これは標準に準拠した機能ですか、それともいくつかのgnu拡張機能ですか?
これは標準です。まず、型以外のテンプレートパラメータの場合:
非型テンプレートパラメータは、次の(オプションでcv修飾された)型のいずれかを持つ必要があります。
- .。
- プレースホルダータイプを含むタイプ。
プレースホルダータイプに次の指定がある場合:
autoおよびdecltype(auto)型指定子は、後で初期化子からの控除によって置き換えられるプレースホルダー型を指定するために使用されます。自動型指定子は、末尾に戻り値の型を持つ関数型を導入したり、ラムダがジェネリックラムダ([expr.prim.lambda.closure])であることを示すためにも使用されます。自動型指定子は、構造化バインディング宣言を導入するためにも使用されます。
プレースホルダータイプは、新しい式のnew-type-idまたはtype-idのtype-specifier-seqでも使用できますおよびtemplate-parameter内のparameter-declarationのdecl-specifier-seqのdecl-specifierとして。
上記の箇条書きは「プレースホルダータイプ」を示しており、そのようなタイプはauto
またはdecltype(auto)
のいずれかで指定できるため、どちらのコンパイラーも正しいです。