【发布时间】:2016-03-30 17:44:52
【问题描述】:
在这段代码中:
typedef int foo;
struct S
{
foo foo;
};
int main() {}
clang -std=c++14 的所有版本都接受此代码,但是g++ -std=c++14 的所有版本都报告:
5 : error: declaration of 'foo S::foo' [-fpermissive]
foo foo;
^
1 : error: changes meaning of 'foo' from 'typedef int foo' [-fpermissive]
代码正确吗?
【问题讨论】:
-
我想说 GCC 在这里是正确的
-
根据诊断状态,您可以使用
-fpermissive开关强制编译...但是为什么要这样做而不是修复代码!?我宁愿得到一个可以悄悄接受的错误,隐藏未来的维护问题。 -
@Clifford,
-fpermissive将error转换为warning。但问题依然存在。将此语句放在任何类方法中都会导致错误:auto x = foo(5);而且,我认为 OP 并不是故意在代码中引入这样的命名。大多数情况下,这是一个好奇的问题,即使是我多年前关于这个确切的话题。这就是为什么重新打开这个问题。 -
Visual Studio 2015 也接受此代码
标签: c++ compiler-errors clang language-lawyer variable-names