Важным отличием является то, что при передаче по ссылке const
новый объект не создается. В теле функции параметр фактически является псевдонимом для переданного объекта.
Поскольку ссылка является ссылкой const
, тело функции не может напрямую изменить значение этого объекта. Это свойство аналогично передаче по значению, когда тело функции также не может изменить значение переданного объекта, в данном случае, поскольку параметр является копией.
Есть принципиальные различия. Если параметр является ссылкой const
, но переданный объект не был фактически const
, то значение объекта может быть изменено во время самого вызова функции.
1011 * Е.Г. *
int a;
void DoWork(const int &n)
{
a = n * 2; // If n was a reference to a, n will have been doubled
f(); // Might change the value of whatever n refers to
}
int main()
{
DoWork(a);
}
Кроме того, если переданный объект на самом деле не был const
, то функция могла бы (даже если это не рекомендуется) изменить свое значение с помощью приведения.
, например
void DoWork(const int &n)
{
const_cast<int&>(n) = 22;
}
Это приведет к неопределенному поведению, если переданный объект на самом деле будет const
.
Когда параметр передается по константной ссылке, дополнительные расходы включают разыменование, худшую локальность объектов, меньше возможностей для оптимизации компиляции.
Когда параметр передается по значению и за дополнительную плату необходимо создать копию параметра. Обычно это касается только большого типа объектов.