#include <iostream>
template<typename T>
struct pair {
const char *key; // никогда не изменяется, назначается только при инициализации 'pair'
T &val;
};
template<typename T>
void set(const pair<T> &pair) {
// тут все хорошо, используем 'pair.key' и 'pair.val'
}
template<typename T>
void get(pair<T> &&pair) {
// тут все плохо, ибо 'pair.val' - константная ссылка
pair.val = 789;
}
int main() {
int rint=0;
pair<int> pi{"int", rint};
set(pair<int>{"int", rint});
set(pi);
////////////////////////////////
get(pair<int>{"int", rint});
std::cout << "rint = " << rint << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGU8dHlwZW5hbWUgVD4Kc3RydWN0IHBhaXIgewogICBjb25zdCBjaGFyICprZXk7IC8vINC90LjQutC+0LPQtNCwINC90LUg0LjQt9C80LXQvdGP0LXRgtGB0Y8sINC90LDQt9C90LDRh9Cw0LXRgtGB0Y8g0YLQvtC70YzQutC+INC/0YDQuCDQuNC90LjRhtC40LDQu9C40LfQsNGG0LjQuCAncGFpcicKICAgVCAgICAgJnZhbDsKfTsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CnZvaWQgc2V0KGNvbnN0IHBhaXI8VD4gJnBhaXIpIHsKICAgLy8g0YLRg9GCINCy0YHQtSDRhdC+0YDQvtGI0L4sINC40YHQv9C+0LvRjNC30YPQtdC8ICdwYWlyLmtleScg0LggJ3BhaXIudmFsJwp9Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgp2b2lkIGdldChwYWlyPFQ+ICYmcGFpcikgewogICAvLyDRgtGD0YIg0LLRgdC1INC/0LvQvtGF0L4sINC40LHQviAncGFpci52YWwnIC0g0LrQvtC90YHRgtCw0L3RgtC90LDRjyDRgdGB0YvQu9C60LAKICAgcGFpci52YWwgPSA3ODk7Cn0KCmludCBtYWluKCkgewogIGludCByaW50PTA7CiAgcGFpcjxpbnQ+IHBpeyJpbnQiLCByaW50fTsKCiAgc2V0KHBhaXI8aW50PnsiaW50IiwgcmludH0pOwogIHNldChwaSk7CgogIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgZ2V0KHBhaXI8aW50PnsiaW50IiwgcmludH0pOwogIHN0ZDo6Y291dCA8PCAicmludCA9ICIgPDwgcmludCA8PCBzdGQ6OmVuZGw7CiAgcmV0dXJuIDA7Cn0=