有谁知道为什么以下代码编译
static const size_t CONSTANT = /* ... */;
template< size_t M = CONSTANT, typename std::enable_if_t< M!=1, size_t > = 0 >
res_type</*...*/> foo()
{
// ...
}
虽然没有:
static const size_t CONSTANT = /* ... */;
template< typename std::enable_if_t< CONSTANT!=1, size_t > = 0 >
res_type</*...*/> foo()
{
// ...
}
非常感谢提前。
最佳
答案 0 :(得分:3)
SFINAE要求失败的替换取决于模板参数。
如果替换失败发生在查找的第一阶段(换句话说,当它不依赖于模板参数时),则程序格式错误,无需诊断。但是在这种情况下,流行的编译器会产生可读错误。
否则,编译器必须等待模板特化的实例化才能知道是否可以进行替换。如果不能,则语言要求不产生硬错误,而是默默忽略。