#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" , 33 } ;
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+IHBpeyJpbnQiLCAzM307CgogIHNldChwYWlyPGludD57ImludCIsIHJpbnR9KTsKICBzZXQocGkpOwoKICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogIGdldChwYWlyPGludD57ImludCIsIHJpbnR9KTsKICBzdGQ6OmNvdXQgPDwgInJpbnQgPSAiIDw8IHJpbnQgPDwgc3RkOjplbmRsOwogIHJldHVybiAwOwp9