It depends on what the function does, what operations are involved, and what error handling is necessary.
A function operating on native types (any operations that do not generate errors) can probably just return instances of those types (values).
A function counting matches with a predicate may impose requirements (no errors) on the operations involved.
A function likely to fail during normal execution should probably not mutate parameters unless absolutely necessary.
Use what is appropriate for the situation.
If you flatly standardize on either method, you'll eventually wish you hadn't.
Soma
Code:
// returns the sum of the parameters
int add(int, int);
Code:
// returns the number of matches against the predicate in the data
int matches(const std::vector<int> &, bool (*)(int));
Code:
// returns false on failure implying an unchanged parameter
bool loadfromfile(std::map<string, string> &, std::istream &);