Рассмотрим этот код:
#include <iostream>
#include <functional>
int xx = 7;
template<class T>
void f1(T arg)
{
    arg += xx;
}
template<class T>
void f2(T arg)
{
    arg = xx;
}
int main()
{
    int j;
    j=100;
    f1(std::ref(j));
    std::cout << j << std::endl;
    j=100;
    f2(std::ref(j));
    std::cout << j << std::endl;
}
При выполнении этот код выводит
107
100
Я бы ожидал, что второе значение будет равным 7, а не 100.
Что мне не хватает?