Я запустил clang-tidy («модернизировать» модули) в дереве проекта, которое я пытался поддерживать в актуальном состоянии с C ++ 17. Почти все, что исправлялось, было для меня неожиданным, за исключением одного: он изменил все эти типы конструкций:
void foo(const std::string& str) {
}
.. на это:
void foo(std::string str) {
}
И я не не понимаю почему. На мой неподготовленный глаз это означало бы две вещи:
- . Это должно было бы скопировать объект, а не просто передать ссылку. (Хотя я предполагаю, что бывают ситуации, когда компилятор может сделать вывод, что он может просто передать указатель при генерации кода - но ссылка делает его явным (что лучше imho)).
- Const есть сказать разработчику тела функции, что он не должен изменять входную строку, и что, если ему нужно изменить строку, ему нужно где-то хранить свою собственную копию.
Я действительно вижу положительный эффект - просто передавая объект в виде ссылки const
, это просто «удалить константное» приведение, которое в любом случае не будет изменено, поэтому я предполагаю, что передача по значению решит эту проблему.
Почему он рекомендует удалять константные ссылки с неконстантными проходными значениями?