Во-первых, если функция пересылает const / non-const своих параметров, то функция все еще может быть чистой, и некоторая более поздняя функция изменит ее. То есть неконстантная ссылка не диктует, что функция определенно изменит ее, а скорее неконстантная ссылка предоставляет доступ, что какая-то операция, в цепочке, изменит состояние (то есть вызовет побочные эффекты). Например, если я хочу написать функцию, которая возвращает первый элемент вектора целых:
int& first(std::vector<int>& v) __attribute__((pure))
{
return *(v.begin());
}
Я могу объявить его чистым, даже если он может принимать неконстантную ссылку, потому что first()
не изменяет вектор. Вместо этого он извлекает только первый элемент (обычно это не вызывает побочных эффектов). Некоторые операции позже могут изменить значение. В этом смысле это только пересылка констант / неконстант диапазона.
Во-вторых, даже если параметры const
, это по-прежнему не гарантирует отсутствие побочного эффекта, поскольку class
может объявить поля изменяемыми, даже если класс равен const
, используя ключевое слово mutable
.