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.