#include <iostream>
void g(int && v1, int & v2)
{
std::cout << v1 << " " << ++v2 << std::endl;
}
template <typename F, typename T1, typename T2>
void flip(F f,T1 && t1, T2 && t2){
g(t2, t1);
}
int main() {
int i = 1, j = 1;
g(12, i); // f changes i
std::cout << "i = " << i << ", j = " << j << std::endl;
flip(g, j, 2);
std::cout << "i = " << i << ", j = " << j << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdm9pZCBnKGludCAmJiB2MSwgaW50ICYgdjIpCnsKICAgIHN0ZDo6Y291dCA8PCB2MSA8PCAiICIgPDwgKyt2MiA8PCBzdGQ6OmVuZGw7Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBGLCB0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CnZvaWQgZmxpcChGIGYsVDEgJiYgdDEsIFQyICAmJiB0Mil7CiAgICBnKHQyLCB0MSk7Cn0KCmludCBtYWluKCkgewoJaW50IGkgPSAxLCBqID0gMTsKCQogICAgZygxMiwgaSk7IC8vIGYgY2hhbmdlcyBpCglzdGQ6OmNvdXQgPDwgImkgPSAiIDw8IGkgPDwgIiwgaiA9ICIgPDwgaiA8PCBzdGQ6OmVuZGw7CgkKCWZsaXAoZywgaiwgMik7CglzdGQ6OmNvdXQgPDwgImkgPSAiIDw8IGkgPDwgIiwgaiA9ICIgPDwgaiA8PCBzdGQ6OmVuZGw7CgkKCXJldHVybiAwOwp9
prog.cpp: In instantiation of 'void flip(F, T1&&, T2&&) [with F = void (*)(int&&, int&); T1 = int&; T2 = int]':
prog.cpp:19:14: required from here
prog.cpp:10:13: error: cannot bind 'int' lvalue to 'int&&'
g(t2, t1);
^
prog.cpp:3:6: note: initializing argument 1 of 'void g(int&&, int&)'
void g(int && v1, int & v2)
^