我无意中偶然发现这一点我一直在寻找在源代码中的一个。 所以,我在这里给了类似的小例子。
在文件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 ++标准,他说,在没有需要解决的范围范围分辨率运营商被忽略?
此代码是无效的。
它是在克一个错误++,它接受的代码。 请参见“G ++不正确对待注入的类名。” 该缺陷被解析为固定的2009年,因此它应固定在任何最新版本克++。
澄清情况,如在§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