2012-07-27 7 views
10
次のコードは、GCC 4.7.1でコンパイルん

デフォルトのテンプレートパラメータをデフォルト以外のものの前に置くことはできますか?

struct X {}; 

template <class T = X, typename U> 
void f(const U& m) { 
} 


int main() { 
    f<>(0); 
} 

しかし、この1つはない:

struct X {}; 

template <class T = X, typename U> 
void f(const U& m) { 
    auto g = []() {}; 
} 


int main() { 
    f<>(0); 
} 

のgcc-4.7.1が文句:

c.cpp: In function 'void f(const U&)': 
c.cpp:5:15: error: no default argument for 'U' 

私の質問です:デフォルト以外のパラメータの前にデフォルトのパラメータを置いて、関数テンプレートに入れていますか?はいの場合、なぜ2番目のファイルはコンパイルされませんか?いいえ、最初のものはなぜコンパイルされますか?この構文についてC++ 11標準はどのように言いますか?

+0

http://stackoverflow.com/questions/2447458/default-template-arguments-for-function-templates – Andrew

+0

@Andrew、投稿した投稿は長すぎます。あなたは、デフォルト以外のパラメータの前にデフォルトのパラメータを置くのが正しいかどうかについて答えていますか? –

+1

@cando:スタンダードには、*関数テンプレートのデフォルトテンプレート引数をどこにでも置くことは禁じられています。 *クラス*テンプレートのみが制限されています。 –

答えて

11

クラスとエイリアスでは、明示的に禁止されています。 n3290 14.1.11状態§:クラステンプレートまたはエイリアステンプレートのテンプレート・パラメータがデフォルトテンプレート引数を持っている場合

を、後続の各 テンプレートパラメータが提供されるデフォルトのテンプレート引数を持っているか、しなければならないのいずれかテンプレートパラメータ パックの機能については

唯一の制限は、パラメータパックに関連すると思わ:

関数テンプレートのテンプレートパラメータパックはであってはなりませんは、そのテンプレートパラメータを推定することができない限り、別のテンプレートパラメータが続くか、デフォルト 引数この場合には関係しません

しかし、はっきりしています。

§14で何も機能を禁止していないとすれば、許可されているとみなされなければならないと思われる。

note from a working group reportsはこれが意図であることを確認しているようです。

クラステンプレートのテンプレートパラメータにデフォルトのテンプレート引数がある場合、すべての後続のテンプレートパラメータにはデフォルトのテンプレート引数が指定されます。 [注意:をテンプレート引数を推測することがありますので、これは、関数テンプレートの要件ではありません(14.8.2 [temp.deduct])。]

そのノートは最終版でどこに行った私は見ることができない

しかし、。

+1

これは許可されています。コンパイラエラーは単なるgccバグですか? –

+0

私は思う*それは許されている。それが義務づけられていないのであれば、それを拒否する言葉がないということは、標準の欠陥である。私のシステム上のclangはそれをコンパイルするのにもかかわらず、それは確かに現時点ではどちらの方法でコンパイラにとって問題になっているのですか? – Flexo

+1

私のMacPortsのclang-3.2は実際にそれをコンパイルします。だから多分クランは既にそれを修正した? –

関連する問題