std::monostate
Материал из cppreference.com
<tbody>
</tbody>
| Определено в заголовочном файле <variant>
|
||
struct monostate { }; |
(начиная с C++17) | |
Тип единицы измерения, предназначенный для использования в качестве правильной пустой альтернативы в std::variant. В частности, variant типов, не конструируемых по умолчанию, может указывать std::monostate в качестве первой альтернативы: это делает сам вариант конструируемым по умолчанию.
Функции-элементы
(конструктор) (объявлено неявно) |
тривиальный неявный конструктор по умолчанию/копирования/перемещения (public функция-элемент) |
(деструктор) (объявлено неявно) |
тривиальный неявный деструктор (public функция-элемент) |
operator= (объявлено неявно) |
тривиальное неявное присваивание копированием/перемещением (public функция-элемент) |
Функции, не являющиеся элементами
std::operator==, !=, <, <=, >, >=, <=>(std::monostate)
<tbody> </tbody> <tbody class="t-dcl-rev t-dcl-rev-num "> </tbody><tbody> </tbody> constexpr bool operator==(monostate, monostate) noexcept { return true; } |
(1) | (начиная с C++17) |
| (2) | ||
constexpr bool operator!=(monostate, monostate) noexcept { return false; } constexpr bool operator<(monostate, monostate) noexcept { return false; } constexpr bool operator>(monostate, monostate) noexcept { return false; } constexpr bool operator<=(monostate, monostate) noexcept { return true; } constexpr bool operator>=(monostate, monostate) noexcept { return true; } |
(начиная с C++17) (до C++20) |
|
constexpr std::strong_ordering operator<=>(monostate, monostate) noexcept { return std::strong_ordering::equal; } |
(начиная с C++20) | |
Все экземпляры std::monostate равны.
|
Операторы |
(начиная с C++20) |
Вспомогательные классы
std::hash<std::monostate>
<tbody> </tbody> template <> struct std::hash<monostate>; |
(начиная с C++17) | |
Специализирует алгоритм std::hash для std::monostate.
Пример
Запустить этот код
#include <cassert>
#include <iostream>
#include <variant>
struct S
{
S(int i) : i(i) {}
int i;
};
int main() {
// Без типа monostate это объявление не будет выполнено.
// Это потому, что S не конструируется по умолчанию.
std::variant<std::monostate, S> var;
assert(var.index() == 0);
try {
std::get<S>(var); // генерирует исключение! Нам нужно присвоить значение
}
catch(const std::bad_variant_access& e) {
std::cout << e.what() << '\n';
}
var = 42;
std::cout << "std::get: " << std::get<S>(var).i << '\n'
std::cout << std::get<S>(var).i << '\n';
<< "std::hash: " << std::hex << std::showbase
<< std::hash<std::monostate>{}(std::monostate{}) << '\n';
}
Возможный вывод:
std::get: wrong index for variant
std::get: 42
std::hash: 0xffffffffffffe19f
Смотрите также
| создаёт объект variant (public функция-элемент) |