decltype和类成员名称之间的交互阴影外部名称

时间:2014-10-31 19:14:01

标签: c++ gcc scope language-lawyer decltype

此代码

int clash;

struct Foo {
  decltype(clash) clash;
};

在clang上静默编译,但无法在gcc上编译而导致错误

  

错误:声明'int Foo :: clash'[-fpermissive]

     

错误:从'int clash'[-fpermissive]

更改'clash'的含义

似乎需要2个成分才能出现错误:

  1. 阴影必须由类成员完成(如果它是函数的本地范围,则没问题)。

  2. 在声明[阴影名称]之前,必须在阴影范围内使用decltype([阴影名称])。

  3. 我的问题有两个:

    1. gcc是否有理由拒绝此代码?
    2. 标准在哪里这样说?

1 个答案:

答案 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 };