I read that they are conceptually equal. In practice, is there any occasion that
foo(T t)
is preferred over
foo(const T&
Built-in types and small objects (such as STL iterators) should normally be passed by value.
This is partly to increase the compiler's opportunities for optimisation. It's surprisingly hard for the compiler to know if a reference parameter is aliasing another parameter or global - it may have to reread the state of the object from memory a number of times through the function, to be sure the value hasn't changed.
This is the reason for C99's restrict keyword (the same issue but with pointers).