std::semiregular (C++20 起)

来自cppreference.com
< cpp‎ | concepts
在标头 <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)
指定类型为正则,即它既 semiregularequality_comparable
(概念)