13

私はこの偽のコードを見つけました(以下の不自然な例):

template <int I, typename T>
struct foo
{
    static int bar()
    {
        return 1;
    }
};

template <std::size_t Index, typename T>
struct foo<Index, T*>
{
    static int bar()
    {
        return 2;
    }
};

特殊化は(誤って)別のタイプを使用することに注意してください。驚くべきことに、GCC 4.8.1 と Clang 3.4 の両方でエラー (または警告) なしでコンパイルされます。foo<0, int*>::bar()しかし、GCC 行の結果がになるのにさらに奇妙なのは1、Clangの場合2です。何が起こっている?それはまだ標準による専門化と見なされていますか?

4

2 に答える 2

0

非型テンプレート引数 14.5.5 [temp.class.spec] パラグラフ 8 でクラス テンプレートを部分的に特殊化することに関する制限には、次の制限がリストされています。

部分的に特殊化された非型引数式は、引数式が単純な識別子である場合を除き、部分的な特殊化のテンプレート パラメーターを含んではなりません。

a を使用した引数式は( is unsigned)size_tへの変換を伴うため、単純な識別子ではありません。intsize_t

于 2013-09-17T18:09:53.547 に答える