被替换上的可变参数参数包类型执行。如果包是空的?(Is substitution performed

2019-06-24 01:18发布

考虑下面的程序:

#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() {}

GCC 4.7 glady接受这一计划。 我最近铛3.1构建声称调用f是模糊的。

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.

它如果我写接受程序f<int, dummy{}>()

看来当包是空的,这会导致无法从候选集删除它铛不考虑参数组的类型。 GCC似乎在即使包是空的参数包类型进行替换,因为所述置换失败的一个过载,没有歧义。

其中两个是正确的?

Answer 1:

我相信我已经找到了相关片standardese的。 §14.8.2p7说:

所述取代发生在所有类型和表达了在函数类型并在模板参数声明使用。

由于EnableIf<dependent_true_type<T>>在模板参数声明时,应发生取代,这是在铛一个错误 。



文章来源: Is substitution performed on a variadic parameter pack type if the pack is empty?