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