是否有一个编译器错误暴露了我的实现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将执行该决议。