参数列表中的 void_t 可以工作,但不能作为返回类型

2024-04-20

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 中编译。这是一个错误吗?


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 中工作相同。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

参数列表中的 void_t 可以工作,但不能作为返回类型 的相关文章

随机推荐