::操作符能否出现在与限定名查找中的作用域解析不同的上下文中?
Can the :: operator appear in the context different from scope resolution in qualified name lookup?
作为已知的范围解析操作符,用于限定名称查找。但是::
返回的值是多少?正如我所理解的,它是后缀一元运算符。考虑以下内容:
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;
}
相关文章:
- C++具有不同作用域的相同名称的名称解析规则
- 用于返回嵌套类类型的作用域解析运算符
- 变量声明中结构的作用域解析是什么意思
- 模板类中静态函数或指针的作用域解析
- 作用域解析运算符和常量
- 模板子类作用域解析
- ::(作用域解析运算符)在C++中用于多种用途
- 使用指向成员的指针时,如何通过作用域解析运算符获取类成员的地址
- 带有继承的C++作用域解析用法
- ::c++中模板函数调用前面的作用域解析运算符
- 为什么作用域解析对覆盖的变量不起作用?
- 如何在涉及依赖作用域的内部类时C++查找模板化函数标头
- isalnum的作用域解析运算符
- c++新内存替换和作用域解析
- 为什么c++的作用域解析操作符是::
- ::操作符能否出现在与限定名查找中的作用域解析不同的上下文中?
- c++语言中的块作用域解析
- 在类定义的类名中,作用域解析操作符的作用是什么?
- 关于c++中作用域解析操作符的问题
- 为什么基类构造函数没有被作用域解析操作符调用