Non compila quanto segue :
#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;
}
L'errore del compilatore è: error: assignment of read-only reference 's'
Ora nel mio caso reale l'elenco è composto da variabili membro su una classe.
Ora, questo non funziona perché l'espressione diventa a initializer_list<int>
che copia effettivamente a, b, c e d - quindi non consente nemmeno la modifica.
La mia domanda è duplice:
C'è qualche motivazione dietro a non permettere di scrivere un loop basato su range in questo modo? per esempio. forse potrebbe esserci un caso speciale per le espressioni di parentesi graffe nude.
Qual è un modo sintattico per sistemare questo tipo di loop?
Qualcosa su questa linea sarebbe preferito:
for (auto& s : something(a, b, c, d)) {
s = 1;
}
Non considero l'indirizzamento indiretto del puntatore una buona soluzione (cioè {&a, &b, &c, &d}
) - qualsiasi soluzione dovrebbe fornire direttamente l'elemento di riferimento quando l'iteratore viene de-referenziato .
initializer_list
è principalmente una vista const
sull'array.
{ &a, &b, &c, &d }
, non vorrai nemmeno:for (auto& s : std::initializer_list<std::reference_wrapper<int>>{a, b, c, d}) { s.get() = 1; }
{ &a, &b, &c, &d }
.