私はこの偽のコードを見つけました(以下の不自然な例):
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
です。何が起こっている?それはまだ標準による専門化と見なされていますか?