为什么当"::"的行为不像运算符时被称为'scope resolution operator'?
Why is `::` called the 'scope resolution operator' when it doesn't act like an operator?
我想不出使用::
指定范围会导致生成任何代码的情况。我能想到的所有其他运算符实际上(至少在概念上(生成代码,它"做某事"。
那么,为什么::
被称为"示波器解析运算符",而它的行为绝不像运算符。在我看来,它更像是名称的一部分,有点词汇绒毛,例如...
或模板参数列表周围的<
和>
,甚至是;
。没有人称;
为"表达式终止运算符"。
它被称为它是否有特定原因(标准中关于它如何以某种方式表现得像操作员一样的引用(?还是这个名字只是历史包袱?
但它是一个运算符,就像成员选择运算符.
一样:
#include <iostream>
int n;
int main()
{
int n = 1;
std::cout << ::n << " " << n;
}
和
#include <iostream>
struct N {
int n = 1;
operator int() const {return 0;}
};
int main()
{
N n;
std::cout << n << " " << n.n;
}
两种情况下的输出相同。
C 或 C++ 中的运算符不需要生成代码。运算符,包括但不限于sizeof
、alignof
,甚至 & 的某些用法(例如衰减到指针的类型(。
如果您特别关注术语"范围",它指的是声明(定义范围(。语句块(括在大括号中(也定义了声明范围。 除非正确解析实际范围,否则不能在其声明范围之外访问任何标识符。嵌套在未命名作用域(例如语句块(中的标识符将永远隐藏在其定义作用域中。但是,名称作用域中的标识符可以通过嵌套作用域的链接分别通过"作用域解析运算符"从外部引用。之所以称为运算符,是因为它对 2(或 1( 个标识符进行操作,以生成编译时引用绑定。将其与创建可调用绑定的成员访问(点(运算符进行比较。 请不要打开解释学的大门,我们在这个论坛上不是在实践哲学。
相关文章:
- 为什么 std::optional::operator=(U&&) 要求你是非标量类型?
- 'operator='已弃用:改用 QDir::setPath()
- 过载'operator new'如何导致无限循环?
- 相当于 pybind11 中的 boost::p ython py::scope().attr()
- 如何修复"error: ‘_1’ was not declared in this scope"?
- 与'operator='不匹配(操作数类型'String'且"void")
- SegFault 同时使用 std::string::operator+= 和函数作为参数
- "local scope"中的 C++ 初始化静态变量
- 处理"no operator found"
- 如何编写 operator= 用于使用虚拟方法与非平凡成员的匿名联合
- 运算符重载:"operator+"必须采用零个或一个参数
- 使用 operator() 扩展 Eigen::EigenBase
- 错误消息:使用"string* +="后"no match for 'operator+='"
- 有没有办法修改'operator->',以便'z->im'返回复数的虚部
- fopen_s 未在 scope(C++:codeblocks ) 中声明
- 使用 scope 运算符 (::) 引用另一个文件中的类
- "operator +="行为异常的定义
- C++ "error: use of overloaded operator '*' is ambiguous"似乎只有一场比赛
- 为什么当"::"的行为不像运算符时被称为'scope resolution operator'?
- 为什么我会得到"Invalid use of :: (scope resolution operator)?"