Namespaces
Variants

std:: semiregular

From cppreference.net
Определено в заголовке <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 является semiregular
// 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 Объектные концепции [concepts.object]
  • Стандарт C++20 (ISO/IEC 14882:2020):
  • 18.6 Объектные концепции [concepts.object]

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

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