It's not necessary but it's usually a good idea to pass arguments of template types by reference because some types are costly to copy and pass by reference avoids copies being made. For simple types like int and double it doesn't really matter.
As Gamer2015 said, you should use const references here, otherwise you will not be able to pass in literals to your function.
1 2 3 4
// Your function would fail here because
// literals (and other temporary objects)
// can't bind to non-const references.
std::cout << max(5, 6) << std::endl;