理解“顶层的‘const’,这可能会降低代码的可读性,而不会提高 const 的正确性”

6 c const-correctness clang-tidy

请考虑下面的代码,特别是观察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();
}
Run Code Online (Sandbox Code Playgroud)

输出:

Length #1 is 124
Length #2 is 123
Run Code Online (Sandbox Code Playgroud)

我从 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
Run Code Online (Sandbox Code Playgroud)

该消息有两个关于返回类型的部分:

  • const 正确性没有提高
  • 代码可读性降低

我理解第一部分,就像在 foo 和 bar 中一样,由于调用者不需要将其局部变量指定为 const,因此最终 const 正确性没有得到改善,即没有什么可以阻止调用者忽略被调用者返回 a 的事实常量对象。

但我不确定“代码可读性降低”是什么意思 - 这仅仅是因为它可能会给一些人错误的期望,即返回类型永远不会被修改?或者还有其他什么东西只有在更复杂的返回类型中才开始有意义?

我问这个问题是因为我不认为这里的可读性会降低,而且我只是不确定警告背后的意图是什么。谢谢。

dxi*_*xiv 6

您可以使用const在那里使用,但 Clang-Tidy 将其标记为无效也是正确的。

\n

为了清楚起见,是否应该在返回类型上使用无用的类型限定符?下的相关问答 ,使用 \xe2\x80\x9cconst\xe2\x80\x9d 与标量类型的好处?涵盖部分原因const涵盖为什么在这种情况下无效的

\n

关于为什么“代码可读性降低”的问题的另一部分是因为多余的const限定符可能会分散人们对常量性不通过值分配这一核心事实的注意力。例如,它可能会诱使客户端代码错误地认为返回值也必须使用,const例如const size_t val = get_length();这是不正确的,如发布的代码所示。

\n

对于争论也有类似的警告。假设 的返回值const size_t get_length();总是传递给另一个函数baz(get_length());。需要的论证baz不(并且可以说不应该)被声明为const size_t但只是简单的size_tvoid baz(size_t);

\n