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

std::semiregular

Материал из 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>// Кредит Александр Степанов// концепты это требования к 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::semiregularauto 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
(концепт)[править]
close