fork(1) download
  1. template<typename T>
  2. struct pair {
  3. const char *key; // никогда не изменяется, назначается только при инициализации 'pair'
  4. const T &val;
  5. };
  6.  
  7. template<typename T>
  8. void set(const pair<T> &pair) {
  9. // тут все хорошо, используем 'pair.key' и 'pair.val'
  10. }
  11.  
  12. template<typename T>
  13. void get(pair<T> &pair) {
  14. // тут все плохо, ибо 'pair.val' - константная ссылка
  15. }
  16.  
  17. int main() {
  18. pair<int> pi{"int", 33};
  19.  
  20. set(pair<int>{"int", 33});
  21. set(pi);
  22.  
  23. ////////////////////////////////
  24. get(pi); // читаем в 'pair<int>'
  25. int rint=0;
  26. get(pair<int>{"int", rint}); // читаем в 'pint' являющийся lvalue, 'pair<int>' же - rvalue
  27. return 0;
  28. }
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
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
Standard output is empty