6

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

namespace A
{
    //something
}

A:: //error: expected unqualified-id before ‘int’

int main(){ }

你能解释一下这种行为吗?

4

4 回答 4

5

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

于 2014-06-01T10:03:24.650 回答
2

据我所知(未重载)::运算符的唯一含义是范围解析。您的代码被解释为A::int main()产生错误的原因。

于 2014-06-01T10:03:14.170 回答
2

::范围解析运算符仅用作...范围解析运算符。

具体而言,标准第 5.1.1/8 节规定的 C++ 语法是:

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-specifiernamespace-name ::具体是A ::. 对于 aqualified-id至少需要and unqualified-id

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

unqualified-id:
    identifier 
    operator-function-id 
    conversion-function-id 
    literal-operator-id
    ~ class-name
    ~ decltype-specifier template-id
于 2014-06-01T10:07:19.793 回答
0

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

标准摘录:

表示一个类的嵌套名称说明符,可选地后跟关键字模板(14.2),然后是该类(9.2)或其基类之一(第 10 条)的成员的名称,是合格的ID;3.4.3.1 描述了对出现在qualified-ids 中的类成员的名称查找。结果是成员。结果的类型是成员的类型。

在您的情况下,编译器正在查找 A::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;
}
于 2014-06-01T10:16:04.237 回答