std::semiregular (C++20 起)
来自cppreference.com
在标头 <concepts> 定义
|
||
template <class T> concept semiregular = std::copyable<T> && std::default_initializable<T>; |
(C++20 起) | |
semiregular
概念指定类型既为可复制亦为可默认构造。它将被表现类似如 int 这样的内建类型的类型所满足,但它们不需要支持以 ==
进行的比较。
示例
运行此代码
#include <concepts> #include <iostream> template<std::semiregular T> // 版权所有 Alexander Stepanov // 概念是 T 上的要求 // T 上的要求:T 为半正则 // T a(b) 或 T a = b => 复制构造函数;T a => 默认构造函数;a = b => 赋值; struct Single { T value; // Single 的聚合初始化表现类似以下构造函数: // explicit Single(const T& x) : value(x) {} // 隐式声明的特殊成员函数表现类似以下定义,除了它们可以拥有额外属性。 // Single(const Single& x) : value(x.value) {} // Single() {} // ~Single() {} // Single& operator=(const Single& x) { value = x.value; return *this; } // 未定义比较运算符;`semiregular` 概念并不要求它 // bool operator==(Single const& other) const = delete; }; void print(std::semiregular auto x) { std::cout << x.value << '\n'; } int main() { Single<int> myInt1{4}; // 聚合初始化: myInt1.value = 4 Single<int> myInt2(myInt1); // 复制构造函数 Single<int> myInt3; // 默认构造函数 myInt3 = myInt2; // 复制赋值运算符 // myInt1 == myInt2; // 错误: operator== 未定义 print(myInt1); // ok: Single<int> 是 `semiregular` 类型 print(myInt2); print(myInt3); } // Single<int> 变量于此销毁
输出:
4 4 4
引用
- C++23 标准(ISO/IEC 14882:2024):
- 18.6 Object concepts [concepts.object]
- C++20 标准(ISO/IEC 14882:2020):
- 18.6 Object concepts [concepts.object]
参阅
(C++20) |
指定类型为正则,即它既 semiregular 也 equality_comparable (概念) |