Единственный раз, когда передача параметра по значению предпочтительнее, это когда вы все равно собираетесь скопировать параметр.
std::string toUpper( const std::string &value ) {
std::string retVal(value);
transform(retVal.begin(), retVal.end(), charToUpper());
return retVal;
}
Или
std::string toUpper( std::string value ) {
transform(value.begin(), value.end(), charToUpper());
return value;
}
В этом случае второй пример имеет ту же скорость, что и первый, если параметр значения является обычным объектом, но быстрее, если параметр значения является R-значением.
Хотя большинство компиляторов уже выполнят эту оптимизацию, я не собираюсь полагаться на эту функцию до C ++ 0X, особенно потому, что я ожидаю, что это может смутить большинство программистов, которые, вероятно, вернут ее обратно.
См. Хотите скорость? Передайте по значению. для лучшего объяснения, чем я мог бы дать.