如何解决理解“顶层的'const',这可能会降低代码的可读性,而不会提高const的正确性” 1常量正确性未得到改善 2代码可读性降低示例
请特别考虑以下代码,观察到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
,但是Clang-Tidy也可以将其标记为无效。
在Should useless type qualifiers on return types be used,for clarity?,Benefits of using “const” with scalar type?下进行的相关问与答涵盖了const
在这种情况下无效的部分原因。
关于“为什么降低代码可读性”的问题的另一部分,这是因为多余的const
限定符可能会分散核心事实,即不继承常量性价值分配。例如,它可能会诱使客户端代码错误地认为返回值必须也必须与const
一起使用,例如。 const size_t val = get_length();
是不正确的,如发布的代码所示。
类似的警告也适用于论点。假设const size_t get_length();
的返回值总是传递给另一个函数baz(get_length());
。 baz
的自变量不需要(也可以说不应)声明为const size_t
,而只是简单的size_t
即void baz(size_t);
。
1。常量正确性未得到改善
返回的值只能用作右值。无法更改右值,因此已经给出了const正确性。
2。代码可读性降低
您正在引导读者做出错误的假设。
示例
/* the rest of your example... */
void baz(void)
{
size_t length = get_length();
length += 42;
printf("Length #2 is %zu\n",length);
}
没有什么可以阻止更改length
。它由常量初始化,例如size_t length = 123;
/* the rest of your example... */
void fu(void)
{
const size_t length = get_length();
length += 42; /* will give a compile-time error */
printf("Length #2 is %zu\n",length);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。