Привет, ЛОР.
Тут такая задачка возникла. Поступает на вход массив неких структур, которые в чём-то схожи, а в чём-то различны и обрабатывать их надо и как единое целое, и по типам (записи разных типов перемешаны). Чтобы не копировать данные туда-сюда и вообще не нарушать целостность, я подумал «а давай-ка сделаю три контейнера ссылок и пусть они ссылаются на оригинальные структуры». Важно: структуры в процессе обработки меняются, т.е. константными я их делать не могу.
Попробовал примерно так:
struct AnyS {
int a, b, c;
};
std::list<AnyS> anyList;
std::map<int, AnyS&> refs0, refs1;
AnyS any;
any.a = 0;
anyList.push_back(any);
int i=0;
for (AnyS& yaAny: anyList) {
if (yaAny.a==0)
refs0[i] = yaAny;
// Тут м.б. рациональнее было бы сделать switch, но не суть, это демо
i++;
}
На строке с присвоением получаю ошибку
/usr/include/c++/11/tuple:1824: ошибка: value-initialization of reference type ‘AnyS&’
Т.е. оно пытается присваивать по значению, хотя я хотел явно противоположного, и у него это не получается.
А что самое смешное? А то, что если я отказываюсь от ссылок и работаю по старинке с указателями, то всё прекрасно работает! Примерно так:
// ...
std::map<int, AnyS*> refs0, refs1;
//...
for (AnyS& yaAny: anyList) {
if (yaAny.a==0)
refs0[i] = &yaAny;
i++;
}
Но нельзя ли всё-таки как-то заставить работать вариант со ссылками? Они, типа, безопаснее, и красивее и вообще сейчас считается, что работа с указателями это фи.
Я, конечно, догадываюсь, что я как-то неправильно использую range-based for… но вот как правильно…
P.S. GCC 11.3.1, если это важно.