Пространства имён
Варианты
Действия

std::semiregular

Материал из cppreference.com
 
 
 
<tbody> </tbody>
Определено в заголовочном файле <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>
// Кредит Александр Степанов
// концепты это требования к 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; }
    // оператор сравнения не определён; он не требуется `полурегулярным` концептом
    // bool operator== (Single const& other) const = delete;
};

void print(std::semiregular auto x)
{
    std::cout << x.value << ' ';
}

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> это `полурегулярный` тип
    print(myInt2);
    print(myInt3);

}   // Переменные Single<int> здесь уничтожаются

Вывод:

4 4 4

Смотрите также

(C++20)
указывает, что тип является регулярным, то есть одновременно semiregular и equality_comparable
(концепт) [править]