Ответ 1
Помните шаблон if(NULL == p)
?
Есть много людей, которые скажут "вы должны написать такой код":
if(NULL == myPointer) { /* etc. */ }
вместо
if(myPointer == NULL) { /* etc. */ }
Обоснование заключается в том, что первая версия защитит кодер от опечаток кода, например, заменив "==" на "=" (потому что запрещено назначать значение постоянному значению).
Далее можно считать продолжение этого ограниченного шаблона if(NULL == p)
:
Почему константные параметры могут быть полезны для кодера
Независимо от типа, "const" является квалификатором, который я добавляю, чтобы сказать компилятору, что " я не ожидаю, что значение изменится, поэтому отправьте мне сообщение об ошибке компилятора, если я буду лгать".
Например, такой код будет отображаться, когда компилятор может мне помочь:
void bar_const(const int & param) ;
void bar_non_const(int & param) ;
void foo(const int param)
{
const int value = getValue() ;
if(param == 25) { /* Etc. */ } // Ok
if(value == 25) { /* Etc. */ } // Ok
if(param = 25) { /* Etc. */ } // COMPILE ERROR
if(value = 25) { /* Etc. */ } // COMPILE ERROR
bar_const(param) ; // Ok
bar_const(value) ; // Ok
bar_non_const(param) ; // COMPILE ERROR
bar_non_const(value) ; // COMPILE ERROR
// Here, I expect to continue to use "param" and "value" with
// their original values, so having some random code or error
// change it would be a runtime error...
}
В тех случаях, которые могут произойти либо с помощью опечатки кода, либо с некоторой ошибкой в вызове функции, будут обнаружены компилятором, который является good thing.
Почему это не важно для пользователя
Бывает так:
void foo(const int param) ;
и
void foo(int param) ;
имеют одну и ту же подпись.
Это хорошо, потому что, если разработчик функции решает, что параметр считается const внутри функции, пользователь не должен этого и не должен знать.
Это объясняет, почему мои объявления функций для пользователей опускают константу:
void bar(int param, const char * p) ;
чтобы сделать декларацию максимально ясной, в то время как мое определение функции добавляет ее как можно больше:
void bar(const int param, const char * const p)
{
// etc.
}
чтобы сделать мой код максимально надежным.
Почему в реальном мире он мог сломать
Я был укушен моим рисунком.
На некотором сломанном компиляторе, который останется анонимным (имя которого начинается с " Sol" и заканчивается на " aris CC" ), две приведенные выше сигнатуры можно рассматривать как (в зависимости от контекста), и, таким образом, ссылка на runtime будет возможно сбой.
Поскольку проект был скомпилирован на платформах Unix (Linux и Solaris), на этих платформах символы undefined оставались разрешенными при выполнении, что вызвало ошибку времени выполнения в середине выполнения процесса.
Итак, поскольку мне пришлось поддерживать указанный компилятор, я закончил загрязнение даже моих заголовков прототипами с констеблями.
Но я все же все же считаю этот шаблон добавления const в определении функции хорошим.
Примечание. У Sun Microsystems даже есть шары, чтобы скрыть свое сломанное рукотворство, так как " это злой шаблон, так что вы не должны использовать его". см. http://docs.oracle.com/cd/E19059-01/stud.9/817-6698/Ch1.Intro.html#71468
Последнее примечание
Следует отметить, что Бьярне Страуструп, похоже, возражал против рассмотрения void foo(int)
того же прототипа, что и void foo(const int)
:
Не все признанные функции, на мой взгляд, являются улучшением. Например, [...] правило, что void f (T) и void f (const T) обозначает ту же функцию (предложенную Томом Plum для совместимости с C) [имеет] сомнительное различие в том, что он был проголосован на С++ "над моим мертвым телом".
Источник: Бьярне Страуструп
Развитие языка в и для реального мира: С++ 1991-2006, 5. Особенности языка: 1991-1998, p21.
http://www.stroustrup.com/hopl-almost-final.pdf
Это забавно считать, что Херб Саттер предлагает противоположную точку зрения:
Указание: Избегайте параметров const-by-value const в объявлениях функций. Все равно сделайте параметр const в том же определении функции, если он не будет изменен.
Источник: Herb Sutter
Исключительный С++, Пункт 43: Const-Correctness, p177-178.