コンテンツにスキップ

最終更新:2026-10-12

C++17 std::variant

最近、いくつか面白い問題を思いついたので、ちょっとしたまとめにしました。あなたはいくつ答えられるでしょうか?

注:完全な答えは星球で公開されます。

問題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::variant の中で std::monostate を使うにはどうしますか?
  2. std::monostate の導入は std::variant の設計にどのような影響を与えますか?
  3. どのような場合に std::monostate を使うのが適切ですか?

問題4:defer_lock_t、try_to_lock_t、adopt_lock_tの3つの違いは何ですか?どんな場面で使いますか?

関連する問題:

  1. defer_lock_t の使用場面と実装メカニズムはどのようなものですか?
  2. try_to_lock_t はミューテックスのロック試行をどのように扱いますか?
  3. adopt_lock_t で既存のロックの所有権を引き継ぐとき、どんな注意点がありますか?

関連トピック

コメント