【问题标题】:Is there any reason for §3.3.7/1.2 to be considered an error?§3.3.7/1.2 是否有任何理由被视为错误?
【发布时间】:2015-03-12 05:02:02
【问题描述】:

此代码是从 §3.3.7/1.5 中的示例获得的:

enum { i = 1 };
class X {
    char v[i]; // error: i refers to ::i
    // but when reevaluated is X::i
    enum { i = 2 };
};

GCC 由于 §3.3.7/1.2 而发出错误

但是,如果我们应用 §3.4.1/7,则在声明 char v[i]; 中查找名称 i 将在全局范围内找到 enum{ i = 1 };。重新声明enum{ i = 2 };有什么问题?

【问题讨论】:

标签: c++ language-lawyer


【解决方案1】:

问题在于,在成员函数范围(和其他类范围)中,枚举的类版本会影响全局值。

如果不是错误,编译器将不得不选择两种令人惊讶的行为之一:

1) 始终使用类枚举的值,这意味着它必须完全解析类以确定是否有有效的大小可用。

2) 类成员中i 的值与声明的类成员数组的实际长度完全不同,理论上,长度相同.

【讨论】:

  • 我明白这一点。但我没有看到错误的原因。
  • @Ayrosa sizeof X{}.v 应该怎么做?
  • 您的号码 (2) 证明了这一点。谢谢。
猜你喜欢
  • 1970-01-01
  • 2016-12-28
  • 2014-10-23
  • 1970-01-01
  • 1970-01-01
  • 2018-10-30
  • 2010-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多