Обратите внимание на приведенный ниже код, в частности, на то, что get_length
возвращает const size_t
.
#include <stdio.h>
const size_t get_length(void)
{
return 123;
}
void foo(void)
{
size_t length = get_length();
length++;
printf("Length #1 is %zu\n", length);
}
void bar(void)
{
// Still 123 because length was copied from get_length
// (copy ellision notwithstanding, which is not the point here)
size_t length = get_length();
printf("Length #2 is %zu\n", length);
}
int main(void) {
foo();
bar();
}
Вывод:
Length #1 is 124
Length #2 is 123
Я получаю следующее предупреждение от clang-tidy:
Clang-Tidy: Return type 'const size_t' (aka 'const unsigned long')
is 'const'-qualified at the top level,
which may reduce code readability without improving const correctness
Это сообщение состоит из двух частей о возвращаемом типе:
- Корректность констант не улучшена
- Читаемость кода снижена
Я понимаю первую часть, где, как в foo и bar, поскольку вызывающим абонентам не требуется указывать свои локальные переменные как const, в конечном итоге правильность const не улучшается, т.е. нет ничего, что мешает вызывающим абонентам игнорировать тот факт, что вызываемый объект возвращает const объект.
Но я не уверен, что подразумевается под снижением читабельности кода - просто потому, что это может дать некоторым людям ложные ожидания, что возвращаемый тип никогда не будет изменен? Или есть что-то еще, что только начинает иметь смысл с более сложными типами возврата?
Я спрашиваю, потому что не считаю, что здесь можно снизить удобочитаемость, и я просто не уверен, что могло быть за этим предупреждением. Спасибо.
const
? если его нет, это влияет на удобочитаемость. - person jdigital   schedule 19.09.2020const
. вы могли пропустить это. - person jdigital   schedule 19.09.2020const
там, но Clang-Tidy также правильно отмечает это как неэффективное. См. Соответствующие Должны ли бесполезные квалификаторы типа для возвращаемых типов для ясности?, Преимущества использования const со скалярным типом?. - person dxiv   schedule 19.09.2020