gpt4 book ai didi

c++ - 在测试 SFINAE 时,我发现了一些我认为不应该起作用的东西

转载 作者:行者123 更新时间:2023-11-30 02:26:30 24 4
gpt4 key购买 nike

我从 this site 中发现了一个有趣的条件函数排除在测试它时我遇到了这个:

#include<type_traits>

namespace detail
{
enum enabler {};
}

template <int overload, typename Condition>
using EnableIf = std::enable_if_t<Condition::value, detail::enabler>;

template <typename T,
EnableIf<0, std::is_same<T, int>>...>
T twice(T t) { return 2 * t; }

template <typename T,
EnableIf<0, std::is_same<T, float>>...>
T twice(T t) { return 2 * t; }

int main()
{
twice(1);
twice(1.f);
return 0;
}

这不会导致编译器错误,因为两个函数中的 EnableIf 类型相同吗?我打算为每个重载使用不同的数字,并有一个包含启用程序枚举的模板类,以便它是不同的类型,但似乎没有必要。这是缺陷还是我遗漏了什么?

我已经在 VC++ (2017) 和 clang 上对此进行了测试.

虽然 VC++ 编译器没有报错,但智能感知显然不喜欢它:

enter image description here

这就是我的想法,但无论我使用不同的整数,还是麻烦按照我说的去做,它都会提示。

最佳答案

Shouldn't this cause a compiler error because the EnableIf type are the same in both functions?

但它们并不相同。一包 std::enable_if_t<std::is_same<T, int>::value, detail::enabler>另一个拿了一包std::enable_if_t<std::is_same<T, float>::value, detail::enabler> .这些是完全不相关的类型,因此您声明了两个不相关的函数模板。实际上,这两种类型中至少有一种是病式的,因此它们不能具有相同的类型——充其量都是病式的。

这很好。不同的数字不仅是不必要的,而且不会做任何事情 - 别名模板是透明的,所以数字会消失,因为您没有在实际类型表达式中使用它。

只有当两个EnableIf条件可行的,然后你最终会在两个函数中得到相同的类型(detail::enabler)。

关于c++ - 在测试 SFINAE 时,我发现了一些我认为不应该起作用的东西,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42773131/

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