范围解析运算符
Scope resolution operator
我不小心在我正在查看的一个源代码中找到了这个。所以,我在这里举一个类似的小例子。
在文件 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
相关文章:
- 重载运算符的范围是什么?它是否会影响作为类成员的集合的插入函数?
- ::(范围解析运算符)前面没有任何东西
- 使用范围解析运算符时,在构造函数中调用虚拟方法是否安全?
- 迭代器的范围 TS 和 C++20 概念是否需要能够使用"运算符>"?
- 运算符重载中的范围运算符
- 重载运算符 [] 以接受范围
- 为什么按位运算符在使用与整数中提供的位数相同的位数计算可能的最大范围时会产生错误
- 为什么C++找不到布尔运算符,当有一个!范围内的运算符?
- 运算符>的范围
- 范围分辨率运算符在类型:: var的情况下返回什么
- 如何在C 中访问无范围分辨率运算符的标头构件类型
- 为什么我们要把 :: (范围重新定位运算符)放在迭代器之前
- 删除复制构造函数和运算符=类范围访问
- 为什么可以使用范围运算符和类 A 名称在类 B 中访问类 A(公共)中的枚举
- 友元运算符中的变量范围
- C++是否提供了一种在没有范围解析运算符的情况下访问类中的类的方法?
- 范围分辨率运算符被两次使用
- 基于范围的循环使用另一个运算符
- 关于在 STL 中使用范围解析运算符的困惑
- 为什么范围解析运算符在类外给出错误