【发布时间】:2023-03-07 18:17:01
【问题描述】:
秒。 3.4.3/3 说:
在声明符 id 是限定 id 的声明中,名称 在声明的qualified-id之前使用,在 定义命名空间范围;查找限定 ID 后面的名称 在成员的类或命名空间的范围内。
有一个来自 3.4.3/3 N3797 的代码示例:
class X { };
class C {
class X { };
static const int number = 50;
static X arr[number];
};
X C::arr[number];// ill-formed:
// equivalent to: ::X C::arr[__C::number__];
// not to: C::X C::arr[__C::number__];
但我认为这不是真的,因为X C::arr[number] 中使用的非限定名称可以在封闭范围内找到,但X C::arr[C::number] 并未在封闭范围内搜索number。是不是笔误?
【问题讨论】:
-
我不太确定我明白你在这里问什么。您是否质疑 C::number 在外部范围内是如何解析的?
-
我认为前面的段落很好地阐述了规则,如果您仔细考虑一下,您可能应该也包含该文本,因为它可以更清楚地说明您的要求。
-
@JoachimIsaksson 不,我知道如何在外部范围内解析 C::number。在
C的封闭范围中找不到名称number。我想澄清X C::arr[number];不等同于::X C::arr[C::number];,而是等同于::X C::arr[number];。这是标准中的错字吗? -
@ShafikYaghmour 已更新。
-
根据编译器实际所做的以及对编译器的合理期望,该示例是正确的。他们在看到
C::之前看到X,并且他们需要能够在继续解析之前解决X,以防止X可能是也可能不是模板时出现的各种问题。但我现在不能说标准的规范性文本是否同意这一点。
标签: c++ class language-lawyer