enable_if 的奇怪行为

strange behavior of enable_if

有谁知道为什么下面的代码可以编译

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()
{
  // ...
}

非常感谢。

最佳

SFINAE 要求失败的替换依赖于模板参数。

如果替换失败发生在查找的第一阶段(换句话说,当它不依赖于模板参数时),则程序格式错误,不需要诊断。但是在这种情况下,流行的编译器会产生一个可读的错误。

否则编译器必须等待模板特化的实例化才能知道是否可以进行替换。如果不能,则语言要求不要产生硬错误,而是静默忽略。