此代码
int clash;
struct Foo {
decltype(clash) clash;
};
在clang上静默编译,但无法在gcc上编译而导致错误
错误:声明'int Foo :: clash'[-fpermissive]
错误:从'int clash'[-fpermissive]
更改'clash'的含义
似乎需要2个成分才能出现错误:
阴影必须由类成员完成(如果它是函数的本地范围,则没问题)。
在声明[阴影名称]之前,必须在阴影范围内使用decltype([阴影名称])。
我的问题有两个:
答案 0 :(得分:10)
gcc
表示程序格式正确,但此特定违规行为不需要诊断,因此clang
无需提供诊断。
如果我们查看C ++ 11标准(最接近的草稿将是N3337 )部分3.3.7
类范围,它会说:
类S中使用的名称N应引用其中的相同声明 上下文,并在完成范围内重新评估 违反此规则需要诊断。
并且下一条规则说:
如果在类中重新排序成员声明会产生备用有效 根据(1)和(2)的程序,该程序是不正确的,没有诊断 必需的。
有意义的是,我们希望防止重新排序类中的声明给出不同程序的情况。很遗憾是these two rules are redundant or not。
该部分还提供以下示例:
enum { i = 1 };
class X {
char v[i]; // error: i refers to ::i
// but when reevaluated is X::i
int f() { return sizeof(c); } // OK: X::c
char c;
enum { i = 2 };
};
如果我们使用gcc
( see it live )尝试此示例,我们会得到与您的代码产生的错误几乎相同的错误:
error: declaration of 'i' [-fpermissive]
enum { i = 2 };
^
error: changes meaning of 'i' from '<anonymous enum> i' [-fpermissive]
enum { i = 1 };