我有一段 C++17 的 SFINAE 代码
#include <type_traits>
template<typename>
constexpr bool dependentFalse = false;
template<typename T>
struct IAmEmpty
{
template<typename U=T, std::enable_if_t<dependentFalse<U>>* =nullptr>
auto deleteMe()
{}
};
template struct IAmEmpty<int>;
https://godbolt.org/z/vWW3favWj
我正在尝试将其重新编写为 C++20,我想知道:
#include <type_traits>
template<typename T>
struct IAmEmpty
{
template<typename U=T>
requires false
void deleteMe() {}
void deleteMeToo() requires false {}
};
template struct IAmEmpty<int>;
据我所知,领先的要求接近使用例如等实现的 C++20 之前的 SFINAE enable_if
。void_t
因此deleteMe
实际上是一个成员函数模板。
deleteMeToo
不是函数模板(或者我错了?)。实例:
https://godbolt.org/z/rGzx8dz3f
是否存在deleteMe
和deleteMeToo
实际上表现不同的情况,并且在优先选择尾随要求而不是前导要求时应该注意?
template <..> requires (..) void foo();
相当于template <..> void foo() requires (..);
所以它只是风格(或者可能是方便在中使用函数参数requires
)。非模板函数仅允许
requires
在之后。一个是模板函数,而另一个不是(它们仍然是来自类的模板实体)。
模板和非模板函数有一些区别。模板有/允许
对于迁移,使用模板没有任何意义(仅为 SFINAE 添加),因此
将成为
您可能会考虑将特征转变
some_condition_v
为概念,以允许包容。