enable_if的奇怪行为

时间:2016-10-16 02:55:23

标签: c++ c++14 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()
{
  // ...
}

非常感谢提前。

最佳

1 个答案:

答案 0 :(得分:3)

SFINAE要求失败的替换取决于模板参数。

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

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