C ++中部分专用的模板实例化忽略了编译时错误

时间:2014-05-12 21:41:09

标签: c++ templates compile-time

以下代码编译(并运行)就好了,即使我希望它产生编译时错误:

#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)。

是否只是为了避免错误而放弃此选择?

1 个答案:

答案 0 :(得分:5)

您所经历的是模板内省的基础,它被称为SFINAE

简单地说:当模板参数替换失败时,它不会抛出但只是&#34; 继续&#34;并抓住下一个没有导致演绎失败的候选人。这对于进行一些编译时分析非常有用。

Boost&#39; enable_if基于SFINAE。