GCC 和 clang 对于默认值是与参数同名的函数的参数存在分歧

Bul*_*net 7 c++ gcc clang language-lawyer

在工作中,我们有一个长期运行的项目,它使用 GCC (8.2) 成功编译。当我们尝试使用基于 clang 的工具(clang-tidy、静态分析器等)时,我们发现 clang 有时会报告 GCC 接受的代码错误。这是一个最近的例子:

#include <vector>

struct Fox{};

using Foxes = std::vector<Fox>;

Foxes& foxes()
{
    static Foxes f;
    return f;
}

void foxy(Foxes& foxes = foxes())
{
    (void)foxes;
}
Run Code Online (Sandbox Code Playgroud)

上述内容被 GCC(8.2 和 12.1)接受,并带有-Wall -Wpedantic -Wextra -Wshadow -Werror. 然而,clang却抱怨道error: default argument references parameter 'foxes'

https://godbolt.org/z/seEb1ahKP

看起来 clang 认为标志foxes右侧的与左侧的=相同。foxesGCC 似乎认为foxes右侧的=是之前定义的函数。

当 GCC 和 clang 不一致时,通常至少其中之一是错误的(除非代码格式不正确但不需要诊断)。哪一个在这里?

GCC 的行为对我来说似乎很可疑;我本以为至少-Wshadow应该对与全局范围内定义的函数同名的参数(局部变量)发出警告。