是否有一个编译器错误暴露了我的实现is_completetypes特质?

我编写了这个C ++ 11 trait模板来检查一个types是否完整:

template <typename...> using void_t = void; template <typename T, typename = void> struct is_complete : std::false_type {}; template <typename T> struct is_complete<T, void_t<decltype(sizeof(T))>> : std::true_type {}; 

并像这样testing它:

 struct Complete {}; int main() { std::cout << is_complete<Complete>::value << is_complete<class Incomplete>::value << '\n'; } 

我期望testing程序打印10 ,这是我得到的输出,当我编译与叮当3.4。 但是,使用gcc 4.9编译时,它会打印11字符 – 错误地将class Incomplete完整的class Incomplete识别为完整的。

我不知道我的代码是否正确,但在我看来,即使它是错误的,它应该在两个编译器上performance相同。

问题1:我的代码是否正确?
问题2:我在其中一个编译器中发现了一个错误吗?

编辑:

我不要求replace我的代码。 我在问gcc或clang中是否有bug,以及这个特定的构造是否正确。

这个问题似乎与void_t的定义有关。 定义为

 template<typename... Ts> struct make_void { typedef void type;}; template<typename... Ts> using void_t = typename make_void<Ts...>::type; 

而是在两个编译器( Demo )上产生正确的结果( 10 )。

我相信这是N3911第2.3节提出的同样的问题,提出了void_t和CWG问题1558 。 从本质上讲,该标准不清楚在别名模板专业化中未使用的参数是否会导致replace失败或者被忽略。 委员会2014年11月会议通过的CWG问题决议澄清了问题中void_t定义应该缩短,GCC 5.0将执行该决议。