Folgendes wird nicht kompiliert:
#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;
}
Compilerfehler ist: error: assignment of read-only reference 's'
In meinem aktuellen Fall besteht die Liste nun aus Mitgliedsvariablen einer Klasse.
Dies funktioniert jetzt nicht, da der Ausdruck zu einem wird initializer_list<int>
, der tatsächlich a, b, c und d kopiert - und daher auch keine Änderung zulässt.
Meine Frage ist zweifach:
Gibt es eine Motivation, auf diese Weise keine bereichsbasierte for-Schleife schreiben zu dürfen? z.B. Vielleicht könnte es einen Sonderfall für nackte Zahnspangen geben.
Was ist eine syntaktisch saubere Methode, um diese Art von Schleife zu reparieren?
Etwas in dieser Richtung wäre vorzuziehen:
for (auto& s : something(a, b, c, d)) {
s = 1;
}
Ich halte Zeiger-Indirektion nicht für eine gute Lösung (das heißt {&a, &b, &c, &d}
) - jede Lösung sollte die Elementreferenz direkt angeben, wenn der Iterator de-referenziert wird .
initializer_list
ist meistens eine Ansicht auf const
Array.
{ &a, &b, &c, &d }
, wollen Sie auch nicht:for (auto& s : std::initializer_list<std::reference_wrapper<int>>{a, b, c, d}) { s.get() = 1; }
{ &a, &b, &c, &d }
.