Последнее обновление:2026-10-12
std::variant в C++17¶
Недавно придумал несколько интересных вопросов и решил сделать небольшое резюме — на сколько из них вы сможете ответить?
Примечание: полные ответы будут раскрыты в сообществе (知识星球).
Вопрос 1: сколько конструкторов типов вызовет конструктор std::variant — 1, 2 или n?
Связанные вопросы:
- Каково поведение
std::variantпри конструировании по умолчанию? - Что происходит, когда типы в
std::variantне имеют конструктора по умолчанию? - Как указать тип начального значения для
std::variant?
Вопрос 2: сможет ли приведённый ниже код нормально работать? Если да — объясните почему, если нет — предложите несколько решений.
struct X {
X(int v) : v_(v) {}
int v_;
};
struct Y {
Y(double v) : v_(v) {}
double v_;
};
std::variant<X, Y> a1;
Связанные вопросы:
- Как добавить в
std::variantтип с конструктором по умолчанию? - Какие есть решения, если в списке типов
std::variantнет конструктора по умолчанию? - как явно сконструировать
std::variant, чтобы избежать проблемы конструирования по умолчанию?
Вопрос 3: что такое monostate и какую проблему он решает?
Связанные вопросы:
- Как использовать
std::monostateвstd::variant? - Какое влияние оказало появление
std::monostateна дизайнstd::variant? - В каких ситуациях уместно использовать
std::monostate?
Вопрос 4: в чём разница между defer_lock_t, try_to_lock_t и adopt_lock_t и в каких сценариях они применяются?
Связанные вопросы:
- Каковы сценарии использования и механизм реализации
defer_lock_t? - Как
try_to_lock_tобрабатывает попытку захвата мьютекса? - На что обратить внимание при передаче владения уже захваченным замком с помощью
adopt_lock_t?
Похожие темы¶
- Атрибут [[nodiscard]] в C++17 | C++那些事
- std::string_view в C++17 | C++那些事
- PMR-ресурсы памяти в C++17 | C++那些事
- Семнадцать расширенных возможностей C++17 | C++那些事
- Выведение аргументов шаблона класса CTAD в C++17 | C++那些事
- C++17 optional_ref | C++那些事
- Структурированные привязки в C++17 | C++那些事
- Выведение auto в шаблонах C++17 | C++那些事
- Шаблоны переменных в C++17 | C++那些事