Ir para o conteúdo

Última atualização:2026-10-12

C++17 std::variant

Recentemente elaborei algumas perguntas interessantes e fiz um pequeno resumo: quantas delas você consegue responder?

Obs.: as respostas completas serão reveladas no Planeta.

Pergunta 1: quantas construções de tipos o construtor do std::variant chama, 1? 2? n?

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

Perguntas relacionadas:

  1. Qual é o comportamento de construção padrão do std::variant?
  2. O que acontece quando os tipos contidos no std::variant não possuem construtor padrão?
  3. Como especificar o tipo do valor inicial de um std::variant?

Pergunta 2: o código abaixo pode ser executado normalmente? Se puder, explique o motivo; caso contrário, apresente algumas soluções.

struct X {
    X(int v) : v_(v) {}
    int v_;
};

struct Y {
    Y(double v) : v_(v) {}
    double v_;
};

std::variant<X, Y> a1;

Perguntas relacionadas:

  1. Como adicionar ao std::variant um tipo que possua construtor padrão?
  2. Quando não há construtor padrão na lista de tipos do std::variant, quais são as soluções possíveis?
  3. Como construir explicitamente um std::variant para evitar o problema da construção padrão?

Pergunta 3: o que é monostate e que problema ela resolve?

Perguntas relacionadas:

  1. Como usar std::monostate em um std::variant?
  2. Que impactos a introdução de std::monostate teve sobre o design do std::variant?
  3. Em que situações é apropriado usar std::monostate?

Pergunta 4: qual é a diferença entre defer_lock_t, try_to_lock_t e adopt_lock_t? Em que cenários são usados?

Perguntas relacionadas:

  1. Quais são os cenários de uso e o mecanismo de implementação de defer_lock_t?
  2. Como try_to_lock_t lida com a tentativa de bloqueio do mutex?
  3. Que cuidados devem ser tomados quando adopt_lock_t assume a propriedade de um bloqueio já existente?

Tópicos relacionados

Comentários