web-dev-qa-db-ja.com

c ++ 17の非型テンプレートパラメーターをdecltype(auto)にすることはできますか?

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拡張機能ですか?

42
W.F.

これは標準です。まず、型以外のテンプレートパラメータの場合:

[temp.param/4]

非型テンプレートパラメータは、次の(オプションでcv修飾された)型のいずれかを持つ必要があります。

  • .。
  • プレースホルダータイプを含むタイプ。

プレースホルダータイプに次の指定がある場合:

[dcl.spec.auto/1]

autoおよびdecltype(auto)型指定子は、後で初期化子からの控除によって置き換えられるプレースホルダー型を指定するために使用されます。自動型指定子は、末尾に戻り値の型を持つ関数型を導入したり、ラムダがジェネリックラムダ([expr.prim.lambda.closure])であることを示すためにも使用されます。自動型指定子は、構造化バインディング宣言を導入するためにも使用されます。

[dcl.spec.auto/5]

プレースホルダータイプは、新しい式のnew-type-idまたはtype-idのtype-specifier-seqでも使用できますおよびtemplate-parameter内のparameter-declarationのdecl-specifier-seqのdecl-specifierとして。

上記の箇条書きは「プレースホルダータイプ」を示しており、そのようなタイプはautoまたはdecltype(auto)のいずれかで指定できるため、どちらのコンパイラーも正しいです。