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 (концепт) |