If it's a builtin (int, double, ...) or small type with a trivial copy constructor, pass by value.
If it's a more complex type, passing by reference is more advantageous.
If you're gonna make a copy of the value in the function, pass by value and use std::move.