概念与类型特质

主要观点:介绍了概念(concept)和类型特征(type trait)的区别,包括在声明、工具和人类交流方面的不同。
关键信息:

  • 可用requires表达式创建类型特征,如template <typename T> constexpr bool has_fun = requires(T v) { v.fun(); };
  • 可用requires子句用类型特征约束模板,如template <typename T> requires std::is_standard_layout_v<T> void fun(T v);
  • 概念可用于声明位置,如template <Small T> void fun(T v);等,这称为“类型约束”。
  • 类型约束通过取概念并提供除第一个参数外的所有参数来创建,对于有多个参数的概念更有趣。
  • 概念可用于声明变量(Small auto x = make_x();等)和requires子句内声明约束。
  • 用概念约束函数重载和类特化时的排序机制与用类型特征不同,更复杂且易出错。
  • 编译器用概念生成更准确的错误消息,能更好地跟踪原子约束。
  • 概念在人类交流方面更好,能传达语义要求,与类型特征不同,概念数量少、较大且文档完善。
    重要细节:
  • 介绍了std::same_asstd::convertible_to等标准库概念在特定位置的使用。
  • 给出了多个函数模板重载示例,展示概念和类型特征在约束方面的差异及可能导致的问题,如joy函数和mud函数的示例。
  • 说明了编译器对概念和类型特征的处理方式不同,以及在不同编译器中可能出现的结果差异,如 Clang 和 GCC 对pain函数的处理。
阅读 10
0 条评论