C++20 已经登陆,带来了概念。如果一个项目现在开始并且仅针对 C++20 和更高版本的标准,那么说以前的约束形式现在被概念和子句取代是否合适requires?
是否存在某些情况下enable_if或void_t仍然需要,而概念无法替代它们?
例如,std::bit_cast被限制为要求To和From类型具有相同的大小,并且两种类型都可以轻松复制。
来自 cppreference:
仅当 sizeof(To) == sizeof(From) 并且 To 和 From 都是 TriviallyCopyable 类型时,此重载才参与重载决策。
MSVC 标准库通过enable_if_t表达式来限制这一点,而 libcxx 选择子句requires。
微软VC:
enable_if_t<conjunction_v<bool_constant<sizeof(_To) == sizeof(_From)>, is_trivially_copyable<_To>, is_trivially_copyable<_From>>, int> = 0
Run Code Online (Sandbox Code Playgroud)
libcxx:
requires(sizeof(_ToType) == sizeof(_FromType) &&
is_trivially_copyable_v<_ToType> &&
is_trivially_copyable_v<_FromType>)
Run Code Online (Sandbox Code Playgroud)
它们通过不同的语言特征执行相同的逻辑运算。
重申我的问题,是否存在无法从一种约束方法转换为另一种约束方法的情况?我知道有很多东西概念requires可以做到enable_if和/或void_t不能做到,但是从另一个方向看也可以这么说吗?针对 C++20 及更高版本的全新代码库是否需要依赖这些旧的语言结构?