范围解析运算符

Scope resolution operator

本文关键字:运算符 范围      更新时间:2023-10-16

我不小心在我正在查看的一个源代码中找到了这个。所以,我在这里举一个类似的小例子。

在文件 test.h 中:

#include<iostream>
class test{
    int i;
public:
    test(){}
    //More functions here
};

在文件测试中.cpp

#include "test.h"
int main()
{
    test test1;
    test::test test2;
    test::test::test test3;
    return 0;
}

首先,有没有理由以这种方式宣布test2?其次,此代码在 g++ 版本 4.4.3 及更低版本中编译得很好。C++标准中是否有一些内容,说当不需要解析范围时,范围解析运算符将被忽略?

此代码无效。

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

为了澄清情况,如§9/2所述:

类名

入到在看到类名后立即声明它的作用域中。类名也入到类本身的作用域中;这称为注入类名。出于访问检查的目的,注入的类名被视为公共成员名。

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

如果限定 id 的嵌套名称说明符指定

了类,则会在类的作用域 (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