std :: enable_if特化失败

Ayj*_*jay 1 c++ templates template-specialization enable-if

我一直在搞乱enable_if,我似乎偶然发现了一些不一致的行为.这是VS2010.我把它减少到下面的样本.

#include <type_traits>

using namespace std;

// enable_if in initial template definition
template <class T, class Enable = enable_if<true>> struct foo {};

foo<int> a; //OK

// explicit specialisation
template <class T, class Enable = void> struct bar;
template <class T> struct bar<T, void> {};

bar<int> b; //OK

// enable_if based specialisation
template <class T, class Enable = void> struct baz;
template <class T> struct baz<T, std::enable_if<true>> {};

baz<int> c; //error C2079: 'c' uses undefined struct 'baz<T>'
Run Code Online (Sandbox Code Playgroud)

这是代码或编译器中的错误吗?

Jam*_*lis 6

std::enable_if<true>应该是typename std::enable_if<true>::type.

std::enable_if<true>总是命名一个类型(如同std::enable_if<false>).为了在条件为假时使替换失败,您需要使用type嵌套的typedef,仅在条件为真时才定义.