参数列表中的void_t有效,但不作为返回类型

时间:2015-03-10 14:57:06

标签: c++ templates c++11 c++14

关于使用别名的cppreference有一个例子。此示例失败,因为int没有成员foo

template<typename...> using void_t = void;
template<typename T> void_t<typename T::foo> f();
f<int>(); // error, int does not have a nested type foo

这很清楚,但是当我尝试将void_t部分放在参数列表中时,意外编译:

template<typename...> using void_t = void;
template<typename T> void f(void_t<typename T::foo>);
f<int>();

它编译clang而不是gcc。这是一个错误吗?

1 个答案:

答案 0 :(得分:8)

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

C ++ 11标准中存在歧义,即使用无效类型/表达式别名的模板的未使用模板参数是否为替换失败。

gcc和clang对这个条款的解释不同,这就是我认为你所看到的。上面的void_t应该使它在gcc和clang中都一样。