Перейти к содержанию

Последнее обновление:2026-10-12

std::variant в C++17

Недавно придумал несколько интересных вопросов и решил сделать небольшое резюме — на сколько из них вы сможете ответить?

Примечание: полные ответы будут раскрыты в сообществе (知识星球).

Вопрос 1: сколько конструкторов типов вызовет конструктор std::variant — 1, 2 или n?

std::variant<std::string, int> a1;
std::variant<X, Y> a2;

Связанные вопросы:

  1. Каково поведение std::variant при конструировании по умолчанию?
  2. Что происходит, когда типы в std::variant не имеют конструктора по умолчанию?
  3. Как указать тип начального значения для 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;

Связанные вопросы:

  1. Как добавить в std::variant тип с конструктором по умолчанию?
  2. Какие есть решения, если в списке типов std::variant нет конструктора по умолчанию?
  3. как явно сконструировать std::variant, чтобы избежать проблемы конструирования по умолчанию?

Вопрос 3: что такое monostate и какую проблему он решает?

Связанные вопросы:

  1. Как использовать std::monostate в std::variant?
  2. Какое влияние оказало появление std::monostate на дизайн std::variant?
  3. В каких ситуациях уместно использовать std::monostate?

Вопрос 4: в чём разница между defer_lock_t, try_to_lock_t и adopt_lock_t и в каких сценариях они применяются?

Связанные вопросы:

  1. Каковы сценарии использования и механизм реализации defer_lock_t?
  2. Как try_to_lock_t обрабатывает попытку захвата мьютекса?
  3. На что обратить внимание при передаче владения уже захваченным замком с помощью adopt_lock_t?

Похожие темы

Комментарии