【发布时间】:2014-04-03 04:51:39
【问题描述】:
以下代码编译。任何人都可以解释为什么?我一直在挖掘标准以弄清楚为什么它是合法的。
template <bool B, typename T = void> struct enable_if { };
template <typename T> struct enable_if<true, T> {
typedef T type;
};
template <typename T, typename Enable = void> struct A;
template <typename T> struct A<T, typename enable_if<(sizeof(T) <= ~0ULL)>::type> {
void f() { }
};
int main() {
A<int> a;
a.f();
}
在声明中:
A<int> a;
由于模板参数“int”只有一个,编译器应该使用主模板,即:
template <typename T, typename Enable = void> struct A;
这是未定义的,因此会导致错误。
【问题讨论】:
-
不,第二个模板是正确的,因为专业化优先于更通用的定义。顺序在这里并不重要。您有两个空间:通用模板和专用模板。如果可以实例化一个specialized,那么它会被实例化,如果不能,那么将查看泛型。
-
为什么不直接使用
std::enable_if? -
@texasbruce 一个可能的原因是很多人仍然需要坚持使用 c++98