C++ 什么是SFINAE

示例

SFINAE代表小号ubstitution ˚F ailure小号ñ加时赛ñ é RROR。由替换类型(或值)以实例化功能模板或类模板导致的格式错误的代码不是硬编译错误,它仅被视为推论失败。

实例化函数模板或类模板专业化时的推导失败将候选对象从考虑范围中删除-好像该失败的候选对象一开始就不存在。

template <class T>
auto begin(T& c) -> decltype(c.begin()) { return c.begin(); }

template <class T, size_t N>
T* begin(T (&arr)[N]) { return arr; }

int vals[10];
begin(vals); //好。第一个功能模板替换失败,因为
             //vals.begin()格式错误。这不是错误!该功能
             // 只是被视为可行的过载候选者而已,
             // 给我们留下数组重载。

仅在即时上下文中的替换失败被视为演绎失败,所有其他失败被视为硬错误。

template <class T>
void add_one(T& val) { val += 1; }

int i = 4;
add_one(i); // 好

std::string msg = "Hello";
add_one(msg); //错误。msg + = 1对于std :: string格式错误,但这
              // 失败不是在立即替换T的情况下