::操作符能否出现在与限定名查找中的作用域解析不同的上下文中?

Can the :: operator appear in the context different from scope resolution in qualified name lookup?

本文关键字:查找 作用域解析 上下文 操作符      更新时间:2023-10-16

作为已知的范围解析操作符,用于限定名称查找。但是::返回的值是多少?正如我所理解的,它是后缀一元运算符。考虑以下内容:

namespace A
{
    //something
}
A:: //error: expected unqualified-id before ‘int’
int main(){ }

你能解释这种行为吗?

范围解析操作符::只是一个语法操作符,没有其他语义。也就是说,有些操作符只对语言的语法有贡献,而其他操作符也对程序的语义/运行时行为有贡献,而且语义可以自定义。

据我所知(未重载)::操作符的唯一含义是范围分辨率。您的代码被解释为产生错误的A::int main()

::范围解析运算符仅用于,嗯…作用域解析操作符。

具体来说,c++语法,如标准§5.1.1/8所规定的,是:

qualified-id:
    nested-name-specifier template(opt) unqualified-id 
nested-name-specifier:
    ::
    type-name ::
    namespace-name ::
    decltype-specifier ::
    nested-name-specifier identifier ::
    nested-name-specifier templateopt simple-template-id ::

在您的情况下,nested-name-specifier的形式是namespace-name ::,特别是A ::。对于qualified-id,您至少需要unqualified-id

根据§5.1.1,unqualified-id具有以下语法:

unqualified-id:
    identifier 
    operator-function-id 
    conversion-function-id 
    literal-operator-id
    ~ class-name
    ~ decltype-specifier template-id

作用域解析操作符::不是函数调用,它是在语言中构建的,编译器使用它来查找名称,它将返回在其右侧找到的类型。

摘自标准:

表示类的嵌套名称说明符,可选地后跟关键字模板(14.2),然后后跟成员的名称类(9.2)或它的一个基类(第10条),是一个限定标识;3.4.3.1描述了类成员的名称查找出现在限定id中。结果就是成员。的类型Result是成员的类型。

在你的例子中,编译器正在查找答::int这显然不是你想要的。

一个简单的例子:

int count = 0;
int main(void) {
  int count = 0;
  ::count = 1;  // set global count to 1
  count = 2;    // set local count to 2
  return 0;
}