В объявлении функции верхний уровень 1 const
удаляется компилятором, пока он сохраняется в определении.
Причина в том, что элемент верхнего уровня скопирован , и с точки зрения вызывающей стороны на самом деле не имеет значения, является ли копия постоянной или нет, так что с этой стороны const-несс не проблема.С другой стороны, в определении функции сохраняется константа аргумента, поскольку она может помочь компилятору обнаружить непреднамеренные изменения аргумента внутри функции.
Итак, в основном:
void foo( int );
void foo( const int ); // redeclaration of the same function
void foo( const int x ) {
++x; // error: x is const!!
}
В приведенном выше коде есть два точно эквивалентных объявления foo
(компилятор удалит const
из объявления) и одно определение.Поскольку в сигнатуре foo
в определении x
объявлено постоянное целое число, компилятор будет жаловаться, если вы попытаетесь увеличить его.
Некоторые люди будут использовать const
в определениизаставить компилятор пометить ++x
как ошибочный, но это не распространено.С другой стороны, независимо от того, объявлен ли аргумент как int
или const int
, для вызывающей стороны они одинаковы.
1 Обратите внимание, что это относится только к верхнему уровню const, который применим к аргументам, передаваемым по значению и указателям, но никогда не к ссылкам (ссылка всегда константная: вы не можете переназначить ссылку).Итак, это разные объявления функций:
void f( int& );
void f( int const & );
void f( int* ); // equivalent to void f( int * const )
void f( int const * ); // equivalent to void f( int const * const )