Functions
F.17
Для параметров «вход-выход» передавайте по ссылке на не-`const`
Причина
Это явно сообщает вызывающим, что предполагается изменение объекта.
Пример
void update(Record& r); // предполагается, что update записывает в r
Примечание
Некоторые пользовательские типы и типы стандартной библиотеки, такие как span<T> или итераторы, дёшевы для копирования и могут передаваться по значению, при этом имея изменяемую (in-out) семантику ссылки:
void increment_all(span<int> a)
{
for (auto&& e : a)
++e;
}
Примечание
Аргумент T& может передавать информацию в функцию и из неё. Таким образом, T& может быть параметром «вход-выход». Это само по себе может быть проблемой и источником ошибок:
void f(string& s)
{
s = "New York"; // неочевидная ошибка
}
void g()
{
string buffer = ".................................";
f(buffer);
// ...
}
Здесь автор g() предоставляет буфер для заполнения f(), но f() просто заменяет его (с несколько большими затратами, чем простое копирование символов). Логическая ошибка может произойти, если автор g() неправильно предположил размер buffer.
Контроль
- (Умеренный) ((Основа)) Предупреждать о функциях с параметром — ссылкой на не-
const, в которые не производится запись. - (Простой) ((Основа)) Предупреждать, если параметр, передаваемый по ссылке на не-
const, используется сmove.