C++ 如果包为空,是否对可变参数包类型执行替换?
考虑以下计划:C++ 如果包为空,是否对可变参数包类型执行替换?,c++,c++11,g++,clang,sfinae,C++,C++11,G++,Clang,Sfinae,考虑以下计划: #include <type_traits> enum class dummy {}; template <typename T> using EnableIf = typename std::enable_if<T::value, dummy>::type; template <typename T> using DisableIf = typename std::enable_if<!T::value, dummy>
#include <type_traits>
enum class dummy {};
template <typename T>
using EnableIf = typename std::enable_if<T::value, dummy>::type;
template <typename T>
using DisableIf = typename std::enable_if<!T::value, dummy>::type;
template <typename T>
struct dependent_true_type : std::true_type {};
template <typename T,
EnableIf<dependent_true_type<T>>...>
std::true_type f();
template <typename T,
DisableIf<dependent_true_type<T>>...>
std::false_type f();
static_assert(decltype(f<int>())::value, "");
int main() {}
如果我写f()
,它会接受该程序
似乎CLAN在包为空时不考虑参数包的类型,因此不会从候选集中移除它。即使包是空的,GCC似乎也会对参数包类型执行替换,并且由于所述替换因一个重载而失败,因此不存在歧义
两者中哪一个是正确的?我相信我已经找到了相关的标准。§14.8.2p7规定: 替换发生在函数类型和模板参数声明中使用的所有类型和表达式中
由于
启用如果在模板参数声明中使用了,则应进行替换,这就是。您能否对PR进行评论并添加您的测试用例?您的测试用例在imho中更为关键,因为它发生在参数推导过程中(我的测试用例只在参数推导之后的末尾遗漏了一个替换),并且因为clang与gcc不同。
test.c++:22:24: fatal error: call to 'f' is ambiguous
static_assert(decltype(f<int>())::value, "");
^~~~~~
test.c++:17:16: note: candidate function [with T = int, $1 = <>]
std::true_type f();
^
test.c++:20:17: note: candidate function [with T = int, $1 = <>]
std::false_type f();
^
1 error generated.