小编Mar*_*per的帖子

C++20 概念是否取代其他形式的约束?

C++20 已经登陆,带来了概念。如果一个项目现在开始并且仅针对 C++20 和更高版本的标准,那么说以前的约束形式现在被概念和子句取代是否合适requires

是否存在某些情况下enable_ifvoid_t仍然需要,而概念无法替代它们?

例如,std::bit_cast被限制为要求ToFrom类型具有相同的大小,并且两种类型都可以轻松复制。

来自 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 及更高版本的全新代码库是否需要依赖这些旧的语言结构?

c++ enable-if c++-concepts c++20 void-t

6
推荐指数
1
解决办法
418
查看次数

标签 统计

c++ ×1

c++-concepts ×1

c++20 ×1

enable-if ×1

void-t ×1