9

以下の最小限の例は、gcc と clang、さらには Visual Studio でも動作しますが、icc ではコンパイルされないことがわかりました。これが有効な C++ であるかどうかを判断しようとしていますが、これはいくつかの異なる概念が組み合わされているため、私の質問に答える標準の関連部分を見つけることができません。

// struct with multiple template parameters
template<typename A, typename B = int>
struct C
{

};

// struct that tries to use C's default second parameter without specifying it
template<typename D, template<typename E, typename ...> class F>
struct G
{
  F<D> h;
};

int main()
{
  G<char, C> i;
}

icc (16.0.3) を使用すると、コンパイルで次のエラーが発生します。

struct.cpp(12): error: too few arguments for template template parameter "F"
    F<D> h;

          detected during instantiation of class "G<D, F> [with D=char, F=C]" at line 17

これは有効な C++ ですか?

C2 番目のテンプレート パラメータのデフォルト値があり、 with が有効な構造であることを意味するF<D>ためF = C、そうあるべきだと私には思えます。

4

1 に答える 1

4

これは gcc/clang のバグだと思います。これは、[まだ開いている] CWG Issue 150に関連しています。提供される根拠には、次のものが含まれます。

テンプレート テンプレート パラメーターのパラメーターには既定の引数を使用できます。これらの既定の引数のみが、テンプレート定義内のテンプレート テンプレート パラメーターの特殊化で考慮されます。テンプレート テンプレート引数のパラメータのデフォルト引数はすべて無視されます。

テンプレート テンプレート パラメーターFには既定の引数がなく、の既定の引数Cは無視されます。したがって、ICC が示唆するように、最終的には不適切な形式の専門化になるはずです。

この号で提供されている例では、gcc と clang の両方がルールを実装しているようです (どちらも呼び出しを許可せず、両方ともMark Mitchell の例f()のパスを通過します。operator float()

于 2016-06-06T14:41:17.813 に答える