gpt4 book ai didi

c++ - 如果包为空,是否对可变参数包类型执行替换?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:50:01 24 4
gpt4 key购买 nike

考虑以下程序:

#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 接受这个程序。我最近的 clang 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{}>() 它确实接受程序.

好像clang在pack为空的时候没有考虑参数pack的类型,导致没有从候选集中移除。即使包为空,GCC 似乎也会对参数包类型执行替换,并且由于所述替换因一个重载而失败,因此没有歧义。

这两个哪个是正确的?

最佳答案

我相信我已经找到了相关的标准语。 §14.8.2p7 说:

The substitution occurs in all types and expressions that are used in the function type and in template parameter declarations.

EnableIf<dependent_true_type<T>>在模板参数声明中使用,应该进行替换,这是 a bug in clang .

关于c++ - 如果包为空,是否对可变参数包类型执行替换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51337631/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com