范围解析操作符(Scope resolution operator)

2019-06-23 10:45发布

我无意中偶然发现这一点我一直在寻找在源代码中的一个。 所以,我在这里给了类似的小例子。

在文件test.h:

#include<iostream>

class test{
    int i;
public:
    test(){}
    //More functions here
};

在文件TEST.CPP:

#include "test.h"

int main()
{
    test test1;
    test::test test2;
    test::test::test test3;
    return 0;
}

首先,是有什么原因宣布test2呀? 其次,这段代码在编译G ++ 4.4.3版本和更低版本就好了。 有什么东西在C ++标准,他说,在没有需要解决的范围范围分辨率运营商被忽略?

Answer 1:

此代码是无效的。

它是在克一个错误++,它接受的代码。 请参见“G ++不正确对待注入的类名。” 该缺陷被解析为固定的2009年,因此它应固定在任何最新版本克++。



Answer 2:

澄清情况,如在§9/ 2规定:

一个类名被插入在其中的类名是看到后立即宣布的范围。 的类名也被插入到类本身的范围; 这是被称为注入的类名。 对于访问检查的目的,就好像它是一个公共成员的名字注入的类名被处理。

然而,如在§3.4.3.1/ 1指定:

如果一个合格的-ID的嵌套namespecifier提名的一类,在嵌套namespecifier后指定的名称在类(10.2)的范围抬头,除下列情况下。

[...§3.4.3.1/ 2]:

在查找,其中所述构造函数是一个可接受的查找结果,并且嵌套名说明符提名C类:

- 如果嵌套名说明符之后指定的名称,当用C抬头,是C(第9)的注入的类名[...]的名称,而不是认为是命名类C的构造

[...例如:]

struct A { A(); };
[ ... ]
A::A a; // error, A::A is not a type name
struct A::A a2; // object of type A


文章来源: Scope resolution operator
标签: c++ scope g++