Se você tiver um std::variant
com tipos duplicados, como atribuir a ele? std::variant
aparentemente permite tipos duplicados.
std::variant<int,int> foo;
compila com sucesso, mas não tenho certeza de como atribuir a foo
, ainda mais se eu desejar atribuir a uma entrada específica na variante.
Eu tentei:
std::variant<int,int> foo;
foo = 1;
falha ao compilar, com o erro que =
é indefinido para std::variant<int,int>
.
std::variant<int,int> foo;
get<foo, 0> = 1;
falha ao compilar com o erro de que não há informações de tipo contextual suficientes para determinar o tipo.
Eu quero algo como
std::variant<int,int> foo;
something<foo, 1> = 10
assert(foo.index == 1);
assert(get<1>(foo) == 10);
Isso colocará a variante em um estado onde a alternativa 0 está ativa e seu valor é 1:
Observe que a semântica de
emplace
não é, em geral, idêntica à de atribuição. O operador de atribuição primeiro verifica se a alternativa atualmente ativa é a mesma que deveria estar ativa após a atribuição. Nesse caso, ele simplesmente atribui à alternativa existente. Em contraste,emplace
sempre destrói primeiro a alternativa atualmente ativa e depois constrói uma, mesmo que a nova alternativa tenha o mesmo índice que a antiga. Para usar a semântica de atribuição, você faria algo assim:Para ints não faz diferença, mas para tipos mais complexos a atribuição às vezes pode ser mais eficiente do que destruir o objeto e criar um novo com o valor desejado.