переданный массив:
void foo(const uint8_t *array_ptr, uintptr_t len);
насколько идиоматично указать в сигнатуре const для указателя и параметра len?
void foo(const uint8_t *const array_ptr, const uintptr_t len);
семантически это не особо на что-то влияет, но с точки зрения сигнатуры может добавить полноты представлению о поведении функции. что скажете на этот счёт?
этот конст ни на что не влияет, только лишь не позволит тебе внутри функции менять значение параметров
О поведении функции вобще ничего не говорит
Холиварная тема, примерно на уровне "а где ставить звёздочку" и "переносить ли скобку". Ответ аналогичный - зависит от принятых в команде соглашений
Для указателя - идеоматично, для второго параметра размера - нет.
для const int* - идеоматично
Кроме того что уже написали, это вытаскивает детали реализации функции в интерфейс. Если завтра понадобится менять array_ptr, придется либо менять сигнатуру, либо создавать еще одну копию в функции.
Вдогонку к const-методам, возвращающим void (без output аргументов).
В объявлении не надо писать, например Resharper подчеркивает и предлагает удалить. Я так и не понял почему Но при этом в опрелелении — стоит поставить const, потому что все переменные по умолчанию должны быть const
Потому что в объявлении это бесполезная инфа - оно для вызывающего, а ему пофиг на твой const. Получается мусорный код
Ну да, только поэтому
вот да. как бы после раста хочется иммутабельным делать всё что можно. вопрос как раз был насколько это идеологично со стороны C)
кто-нибудь может мне пояснить эту идеологию с иммутабельностью?
const, к сожалению, не гарантирует иммутабельность
"Полное спокойствие может дать человеку только страховой полис" (с) Остап Бендер
Гарантирует. Вернее, будет ub если нарушишь
Нет, не гарантирует, потому что у тебя одновременно могут существовать мутабельный и не мутабельный указатель на данные (я не говорю про const_cast, если что)
Со стороны С всё не очень, там куча легаси, которое не уважает const. А вот в С++ рекомендуется херачить const по дефолту (кроме пары случаев)
При чем тут указатель? Если у тебя объект константный, то ты на него не сможешь взять указатель, который сможет его изменить
Речь шла про сигнатуру функции, принимающей указатель на константные данные. Так вот, на самом деле, ничего не гарантирует, что данные действительно константные.
Ну дак это правильно, потому что это разные гарантии. Чтобы гарантировать неизменяемость, надо создавать const объект
Абсолютно верно про const объект, но имхо люди эти гарантии часто путают
Это нормально C++ Core Guidelines даже рекомендуют сложную инициализацию выносить в immediately invoked lambda expression, чтобы переменную можно было сделать const
внутри лямбды всё равно будут не const переменные)
Обсуждают сегодня