Я знаю, что есть несколько вопросов о корректности const, где указано, что декларация функции и ее определение не должны согласовывать значения параметров. Это связано с тем, что константа параметра значения имеет значение только внутри функции. Это нормально:
// header
int func(int i);
// cpp
int func(const int i) {
return i;
}
Является ли это действительно лучшей практикой? Потому что я никогда не видел, чтобы кто-то это делал. Я видел эту цитату (не уверен в источнике) в других местах, о которой это говорилось:
"На самом деле, для компилятора, сигнатура функции одинакова, включаете ли вы эту константу перед параметром значения или нет".
"Избегайте параметров const-by-value const в объявлениях функций. Все-таки сделайте параметр const в том же определении функции, если он не будет изменен".
Во втором абзаце говорится, что он не помещает const в объявление. Я предполагаю, что это связано с тем, что константа параметра значения бессмысленна как часть определения интерфейса. Это деталь реализации.
Исходя из этой рекомендации, рекомендуется ли это также для указательных значений параметров указателя? (Это не имеет смысла для ссылочного параметра, поскольку вы не можете переназначить ссылку.)
// header
int func1(int* i);
int func2(int* i);
// cpp
int func1(int* i) {
int x = 0;
*i = 3; // compiles without error
i = &x; // compiles without error
return *i;
}
int func2(int* const i) {
int x = 0;
*i = 3; // compiles without error
i = &x; // compile error
return *i;
}
Резюме: Создание параметров значения полезно для обнаружения некоторых логических ошибок. Это лучшая практика? Вы доходите до крайности, оставляя const из файла заголовка? Это также полезно для значений указателя const? Почему или почему нет?
Некоторые ссылки:
ключевое слово С++ const - используйте либерально? Использование 'const' для параметров функции
Пример того, когда значения параметра const полезны:
bool are_ints_equal(const int i, const int j) {
if (i = j) { // without the consts this would compile without error
return true;
} else {
return false;
}
// return i = j; // I know it can be shortened
}