【发布时间】:2013-09-22 06:27:07
【问题描述】:
我发现了这段假代码(下面是人为的例子):
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 中编译时没有任何错误(或警告)。但更奇怪的是 GCC 行 foo<0, int*>::bar() 结果为 1,但 Clang 给出了 2。到底是怎么回事?它仍然被标准视为专业化吗?
【问题讨论】:
-
特化 size_t 应该是一个错误 (int != size_t)
-
所以两个编译器都错了?听起来很……不太可能;-)
-
你们为什么认为这是一个专业化?
-
@ruslo 可能是我错了。我在阅读问题时遗漏了部分代码。
-
我怀疑:
std::size_t和int可能仅在函数参数的情况下被视为不同的类型,而不是模板参数?
标签: c++ templates gcc clang template-specialization