O seguinte não compila:
#include <iostream>
int main()
{
int a{},b{},c{},d{};
for (auto& s : {a, b, c, d}) {
s = 1;
}
std::cout << a << std::endl;
return 0;
}
O erro do compilador é: error: assignment of read-only reference 's'
Agora, no meu caso atual, a lista é feita de variáveis de membro em uma classe.
Agora, isso não funciona porque a expressão se torna um initializer_list<int>
que realmente copia a, b, ce ed - portanto, também não permite modificações.
Minha pergunta é dupla:
Existe alguma motivação por trás de não permitir escrever um loop for baseado em intervalo dessa maneira? por exemplo. talvez possa haver um caso especial para expressões de chaves nuas.
Qual é uma maneira pura e sintática de corrigir esse tipo de loop?
Algo nessa linha seria preferido:
for (auto& s : something(a, b, c, d)) {
s = 1;
}
Não considero a indireção do ponteiro uma boa solução (ou seja {&a, &b, &c, &d}
) - qualquer solução deve fornecer referência ao elemento diretamente quando o iterador é desassistido .
initializer_list
é principalmente uma visão da const
matriz.
{ &a, &b, &c, &d }
, também não vai querer:for (auto& s : std::initializer_list<std::reference_wrapper<int>>{a, b, c, d}) { s.get() = 1; }
{ &a, &b, &c, &d }
.