C ++ хочет быть совместимым с C, а поскольку C по умолчанию использует семантику значений, то же самое относится и к C ++. Было бы очень непоследовательным принимать встроенные типы по значению, но другие типы по ссылке.
Однако передача по ссылке не всегда лучше. Как правило, косвенное обращение к указателю приводит к тому, что компилятору становится труднее оптимизировать код gen. Во многих случаях передача типа по значению все же лучше, чем по ссылке. Это зависит от типа. Переадресация указателей на ссылки может вызвать чтение памяти, а передача по значению позволяет передавать объект в регистры процессора. Например, такой тип:
class Point {
public:
/* functions */
private:
int x;
int y;
};
Всегда должен передаваться по значению. Это просто два целых числа. Ссылка может привести к тому, что ненужные чтения из памяти получат значения.
Кроме того, иногда требуется передать по значению, даже если тип не может быть зарегистрирован. Так называемые «функции приемника», например, которые должны хранить переданное значение, лучше работают со значениями благодаря семантике перемещения. Основные примеры - это constructros и setters:
void SomeClass::setString(std::string s)
{
this->s_ = std::move(s);
}
Передача по ссылке в этом случае может привести к дополнительным копиям. Вы можете прочитать больше об этом онлайн. Хорошей отправной точкой является следующий вопрос:
Являются ли дни передачи const std :: string & в качестве параметра более?