Gostaria de poder decompor uma ligação estruturada, digamos, std::pair<T, U>
em uma variável não constante e uma variável constante:
Por exemplo
std::pair<int, int> anExamplePair = std::make_pair(1, 2);
auto [nonConstVariable, constVariable] = anExamplePair;
Isso é possível ou mesmo sensato ou preciso tornar ambas as variáveis na ligação estruturada const ou não const?
Não é isso que uma vinculação estruturada faz. A vinculação estruturada (implicitamente) declara uma variável e o
auto
ou quaisquer outros especificadores de tipo se aplicam a essa variável .Os nomes dados à vinculação estruturada são usados como se fossem referências aos subobjetos daquela única variável ou ao resultado de uma
get
chamada de acordo com a interface de tupla de tipos.Essas referências podem ou não ser
const
-qualificadas. Isso não é (puramente) decidido pelo uso ou nãoconst
na vinculação estruturada. Um tipo pode definir sua interface de tupla para que elas sejam sempre ou nuncaconst
-qualificadas, independentemente daconst
variável em si.No caso de
std::pair
éconst
herdado viastd::pair
interface de tupla de , então aquiconst
na variável determina se ambos ou nenhum dos nomes recém-introduzidos se comportam comoconst
referências. Não é possível adicionar outroconst
ao tipo para um dos nomes. Não há sintaxe para isso.Em particular, dado seu exemplo exato, a vinculação estruturada na verdade introduz uma cópia de
anExamplePair
e os dois nomes estarão referenciando os elementos naquela cópia. Você deve usarauto&
instead ofauto
se quiser referências intoanExamplePair
.Se você der um nome ao par de qualquer maneira, então não há realmente nenhum ponto em usar uma ligação estruturada de qualquer maneira. Você não ganha muito versus
o que permite que você forneça o
const
qualificador - explicitamente também.As vinculações estruturadas são apenas um recurso sintático para evitar ter que nomear o objeto completo (e talvez para evitar escrever
std::get
explicitamente várias vezes).