嵌套std :: void_t,std :: enable_if和包扩展

问题描述 投票:1回答:1

我想启用一个可变参数模板仅当所有模板参数均为整数类型时。我下面的解决方案嵌套了std::void_tstd::enable_ifstd::is_integral和包扩展,可以在gcc 8.3.0中按预期工作,但不在clang 8.0.0-3中(代码会编译,但是在clang替换成功时,应该失败时,如下注释所示)。在两种情况下,我都使用

进行编译
 c++ -std=c++17 -Wall -Wextra -pedantic-errors

其中c ++是g ++或clang ++。

我不知道这是否与缺陷有关在cppreference documentation of std::void_t中提到,或者这是我设计中的错误。

换句话说:我的简单SFINAE原则上正确吗?

我也注意到,替换为std::void_tstd:void_t<...>

typename Voidify<...>::type

使两个程序的行为均与template<typename ... > struct Voidify{ typedef void type; }; 的gcc版本相同>

这是我的代码:

std::void_t<...>

我想拥有一个可变参数模板,仅当所有模板参数均为整数类型时才启用。我下面的解决方案嵌套了std :: void_t,std :: enable_if,std :: is_integral并打包...

c++ sfinae
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.