2015-11-13 20 views
8

C++ 11 introduced関数テンプレートのデフォルトのテンプレート引数。 Default template arguments for function templatesも参照してください。関数テンプレートの最後のデフォルトテンプレート引数

しかし、C++標準を読んでも、最初のテンプレート引数にはデフォルトのテンプレート引数を使用し、他のテンプレート引数には使用しない関数テンプレートを定義することはできませんでした。

これは、default argumentsがどのように処理されるかの逆です。これ以降のすべてのパラメータには、デフォルトの引数が指定されている必要があります。ファンクション・パラメータ・パックでもかまいません。

デフォルト引数とデフォルトのテンプレート引数の違いは一見奇妙に思えるが、としての構造が可能になります:

template <typename TException = std::exception, typename TObjectBuilder> 
auto SwallowExceptions(const TObjectBuilder& rObjectBuilder) -> decltype(rObjectBuilder()) 
{ 
    try 
    { 
     return rObjectBuilder(); 
    } 
    catch (const TException&) 
    { 
     return decltype(rObjectBuilder())(); 
    } 
} 

この法的C++コードと標準でこれを見つけることができるどこ?

答えて

8

私はそれを可能にする直接引用符を見ることはできませんが、それは確かに省略によって許可されている:クラステンプレートまたはエイリアステンプレートのテンプレート・パラメータがデフォルトテンプレート引数を持っている場合

N3337 [temp.param]/11:それぞれの後続のテンプレートパラメータは、デフォルトのテンプレート引数が提供されるか、またはテンプレートパラメータ パックでなければならない。プライマリクラステンプレートまたはエイリアステンプレートのテンプレートパラメータがテンプレートパラメータパックの場合は、 が最後のテンプレートパラメータになります。ファンクションテンプレートのテンプレートパラメータパックは、 ではなく、そのテンプレートパラメータを推測できるか、またはデフォルトの 引数(14.8.2)を持たないかぎり、別のテンプレートパラメータが続きます。

これは、クラステンプレートとエイリアステンプレートでは許可されていませんが、関数のテンプレートからは省略できます。

関連する問題