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
右侧的与左侧的=
相同。foxes
GCC 似乎认为foxes
右侧的=
是之前定义的函数。
当 GCC 和 clang 不一致时,通常至少其中之一是错误的(除非代码格式不正确但不需要诊断)。哪一个在这里?
GCC 的行为对我来说似乎很可疑;我本以为至少-Wshadow
应该对与全局范围内定义的函数同名的参数(局部变量)发出警告。
归档时间: |
|
查看次数: |
60 次 |
最近记录: |