template < typename T>
struct pair {
const char * key; // никогда не изменяется, назначается только при инициализации 'pair'
const 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' - константная ссылка
}
int main( ) {
pair< int > pi{ "int" , 33 } ;
set( pair< int > { "int" , 33 } ) ;
set( pi) ;
////////////////////////////////
get( pi) ; // читаем в 'pair<int>'
int rint= 0 ;
get( pair< int > { "int" , rint} ) ; // читаем в 'pint' являющийся lvalue, 'pair<int>' же - rvalue
return 0 ;
}
dGVtcGxhdGU8dHlwZW5hbWUgVD4Kc3RydWN0IHBhaXIgewogICBjb25zdCBjaGFyICprZXk7IC8vINC90LjQutC+0LPQtNCwINC90LUg0LjQt9C80LXQvdGP0LXRgtGB0Y8sINC90LDQt9C90LDRh9Cw0LXRgtGB0Y8g0YLQvtC70YzQutC+INC/0YDQuCDQuNC90LjRhtC40LDQu9C40LfQsNGG0LjQuCAncGFpcicKICAgY29uc3QgVCAgICAgJnZhbDsKfTsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CnZvaWQgc2V0KGNvbnN0IHBhaXI8VD4gJnBhaXIpIHsKICAgLy8g0YLRg9GCINCy0YHQtSDRhdC+0YDQvtGI0L4sINC40YHQv9C+0LvRjNC30YPQtdC8ICdwYWlyLmtleScg0LggJ3BhaXIudmFsJwp9Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgp2b2lkIGdldChwYWlyPFQ+ICZwYWlyKSB7CiAgIC8vINGC0YPRgiDQstGB0LUg0L/Qu9C+0YXQviwg0LjQsdC+ICdwYWlyLnZhbCcgLSDQutC+0L3RgdGC0LDQvdGC0L3QsNGPINGB0YHRi9C70LrQsAp9CgppbnQgbWFpbigpIHsKICBwYWlyPGludD4gcGl7ImludCIsIDMzfTsKCiAgc2V0KHBhaXI8aW50PnsiaW50IiwgMzN9KTsKICBzZXQocGkpOwoKICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogIGdldChwaSk7IC8vINGH0LjRgtCw0LXQvCDQsiAncGFpcjxpbnQ+JwogIGludCByaW50PTA7CiAgZ2V0KHBhaXI8aW50PnsiaW50IiwgcmludH0pOyAvLyDRh9C40YLQsNC10Lwg0LIgJ3BpbnQnINGP0LLQu9GP0Y7RidC40LnRgdGPIGx2YWx1ZSwgJ3BhaXI8aW50Picg0LbQtSAtIHJ2YWx1ZQogIHJldHVybiAwOwp9
compilation info
prog.cpp: In function 'int main()':
prog.cpp:26:29: error: invalid initialization of non-const reference of type 'pair<int>&' from an rvalue of type 'pair<int>'
get(pair<int>{"int", rint}); // читаем в 'pint' являющийся lvalue, 'pair<int>' же - rvalue
^
prog.cpp:13:6: note: in passing argument 1 of 'void get(pair<T>&) [with T = int]'
void get(pair<T> &pair) {
^
stdout