Por que esse código não compila com uma mensagem de erro?
#include <initializer_list>
int main() {
auto [a, b] = { 1, 2 };
}
erro: não é possível decompor o membro inacessível 'std::initializer_list<int>::_M_array' de 'std::initializer_list<int>'
Mas esse código compila e funciona bem?
#include <utility>
int main() {
auto [a, b] = std::make_pair(1, 2);
}
O que há de tão específico em uma lista de inicializadores que torna seus membros inacessíveis?
Existe algum tipo de suposição de que uma lista de inicializadores cria um objeto (de uma classe) com campos privados (ou mesmo "estrutura interna inacessível") ou há algo mais em jogo?
A ligação estruturada funciona com matrizes ou tipos semelhantes a tuplas. De cppreference :
std::initializer_list
não é um array, nem semelhante a uma tupla, nem possui membros acessíveis.Simplesmente não concede acesso direto ao array subjacente. É um membro privado.
std::pair
por outro lado, é semelhante a uma tuplafirst
esecond
pode ser acessado viastd::tuple_element
.