【发布时间】:2018-03-18 02:51:48
【问题描述】:
#include <type_traits>
template<bool b>
struct S
{
template<typename = std::enable_if_t<b>>
S() {}
template<typename = std::enable_if_t<!b>>
S(int) {}
};
S<true> s{}; // error in clang/gcc, OK in VC2017
S<false> s{0}; // error in clang/gcc, OK in VC2017
在这两种情况下,clang/gcc 都会尝试实例化由于 SFINAE 而实际上应该被丢弃的 ctor。错误信息是:
错误:在 'std::enable_if' 中没有名为 'type' 的类型; 'enable_if' 不能用于禁用此声明
clang/gcc 对另一个 ctor 的实例化是不正确的,因为它应该不在可能的重载列表中,对吧?
但在我提交错误之前,我想先了解一下其他人的想法。可能我没听懂……
【问题讨论】:
-
你可以通过引入直接上下文来解决它:
template<bool B = b, typename = std::enable_if_t<B>> -
@PiotrSkotnicki:太棒了。请将其发布为答案。