范围解析运算符

Ash*_*win 32 c++ scope g++

我偶然碰巧在我看到的一个源代码中找到了这个.所以,我在这里给出了一个类似的小例子.

在文件test.h中:

#include<iostream>

class test{
    int i;
public:
    test(){}
    //More functions here
};
Run Code Online (Sandbox Code Playgroud)

test.cpp文件中:

#include "test.h"

int main()
{
    test test1;
    test::test test2;
    test::test::test test3;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

首先,是否有理由宣布test2这种方式?其次,这个代码在g ++ 4.4.3版和更低版本中编译得很好.C++标准中有什么东西说,当不需要解析范围时,范围解析运算符会被忽略吗?

Jam*_*lis 41

此代码无效.

这是g ++中的一个错误,它接受了代码.请参阅"g ++不能正确处理注入的类名". 该错误已于2009年解决,因此应在任何最新版本的g ++中修复.

  • @kralyk:是的.观察到ideone正在使用gcc 4.3.4并观察如果使用其"C++ 0x"选项进行编译,该选项使用gcc 4.5.1,则代码将被拒绝. (3认同)

Jer*_*fin 16

根据§9/ 2的规定澄清情况:

在看到类名后立即将类名插入到作用域中.类名也插入到类本身的范围内; 这被称为注入类名.出于访问检查的目的,inject-class-name被视为公共成员名称.

但是,如§3.4.3.1/ 1中所述:

如果qualified-id的nested-name-specifier指定了一个类,则在类(10.2)的范围内查找在嵌套的namespecifier之后指定的名称,但下面列出的情况除外.

[......§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
Run Code Online (Sandbox Code Playgroud)