以下代码编译(并运行)就好了,即使我希望它产生编译时错误:
#include <iostream>
using namespace std;
template <typename T>
struct is_int {
static const bool value = false;
};
template<>
struct is_int<int> {
static const bool value = true;
};
// General template definition with default second type parameter (void)
template <typename A, typename B = void>
struct Foo {
static const int i = 42;
};
// Partially specialized template definition with possibly
// undefined second parameter
template<typename A>
struct Foo<A, typename enable_if<is_int<A>::value>::type > {
static const int i = 56;
};
int main() {
cout << Foo<bool>::i << endl; // Outputs '42'
cout << Foo<int>::i << endl; // Outputs '56'
return 0;
}
如果第一个参数是值enable_if
,则结构Foo
的部分特化中的type
模板仅定义成员类型true
。请参阅reference page。
那么,当main
函数的第一行实例化模板Foo
时,编译器究竟做了什么?显然,当它尝试匹配部分特化时,会遇到错误(因为未定义type
)。
是否只是为了避免错误而放弃此选择?