2017-09-03 7 views
36

gccとclangは、非タイプのテンプレートパラメータ型節でdecltype(auto)を使用できることを発見しました。例えば:C++で非型テンプレートパラメータを宣言型(auto)にすることはできますか?

template <decltype(auto)> 
struct X {}; 

int foo ; 

int main() { 
    X<(foo)> x; 
    static_cast<void>(x); 
} 

[live demo gcc][live demo clang]

それが標準に準拠した特徴ですか、それはいくつかのGNU拡張機能ですか?

+8

これは、私が遅刻している理由です。そのような質問は、自分自身で言語についてもっと学ぶことができるものです。 – StoryTeller

+7

@StoryTeller私は、少なくとも私のために、C++はまだ驚きの完全であることを認めています:) –

+1

非常に良い質問。 +1そして、@ストーリーテラー:私はあなたにdefinetely同意する。 – skypjack

答えて

28

これは標準です。まず、非型テンプレートパラメータに:

  • [temp.param/4]

    非型テンプレートパラメータは、次の (随意CV修飾)型のいずれかでなければなりません。 ..

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

    [dcl.spec.auto/1]

    オートとdecltype(自動)型指定子をあろう プレースホルダタイプを指定するために使用されている:プレースホルダの種類は、以下を指定している

後で イニシャライザから差し引かれました。 auto型指定子は、末尾リターン型の 関数型を導入するために、または ラムダが汎用ラムダ([expr.prim.lambda.closure])であることを示すためにも使用されます。自動 型指定子は、構造化バインディング 宣言の導入にも使用されます。 [dcl.spec.auto/5]

プレースホルダタイプ

はまた、 新型-IDまたは新しい式の型IDとタイプ指定子-配列でを使用することができますパラメータの宣言指定子 テンプレートパラメータのパラメータ宣言のdecl-specifier-seq

上記弾丸「はプレースホルダ型」と言うと、そのようなタイプのいずれかauto又はdecltype(auto)で指定することができるので、両方のコンパイラが正しいです。

関連する問題