【问题标题】:Name lookup after qualified declarator-id符合条件的 declarator-id 后的名称查找
【发布时间】: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


【解决方案1】:

据我所知,示例是正确的,并且直接来自示例之前的段落:

在 declarator-id 是限定 ID 的声明中,names 在声明的qualified-id之前使用的在 定义命名空间范围

所以找到的X 将是::X 而不是C::X,因为它在qualified-id 之前

和:

名称跟在限定ID之后被查看 在成员的类或命名空间范围内

所以number 将是C::number,因为它在qualified-id 之后。

【讨论】:

  • 但是::X C::arr[C::number] 不等于评论中所说的X C::arr[number]
  • X C::arr[number] 相当于示例上下文中的::X C::arr[number]
  • @DmitryFucintv 在示例的上下文中numberC::number 是等价的,因为存在C::number。如果C::number 不存在,但::number 存在,那么C::number::number 当然是不等价的,但该示例不会尝试声明其他内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-24
  • 1970-01-01
  • 1970-01-01
  • 2022-11-27
  • 2012-04-11
  • 1970-01-01
相关资源
最近更新 更多