为什么我不能重载::运算符?

3
我正在阅读Stanley B. Lippman的C++ Primer一书,其中在变量和基本类型一节中我看到了作用域运算符::
我已经稍微了解过运算符重载,并且认为它在特殊情况下可能非常有用,但当我在互联网上搜索时,我发现我根本无法重载::运算符。
这篇文章中,我发现.运算符可以被重载。然而,这可能会引起关于操作是为对象重载.还是由.引用的对象的疑问。
因此,我认为也许有一种方法可以重载::但如果不能,请有人向我解释原因吗? 我对::运算符的想法示例:
#include <iostream>

/*
 *For example:
 *I wanna increase 1 unit every time 
 *I call the global variable r doing ::r
 *insede of the main function
 */

int r = 42; 

int main()
{
    int r = 0;
    std::cout << ::r << " " << r << std::endl; //It would print 43 0 after the operator overload

    return 0;
}

7
"operator" 这个作用域不像其他运算符一样在运行时做任何操作,而是影响编译时的名称查找,这就是为什么无法对其进行重载。 - Borgleader
@Borgleader和我无法在运行时使其执行某些操作? - Gabriel
@GabrielMello 不是的,因为它的唯一工作就是告诉编译器在哪里找到名称。 - Borgleader
7
我发现“.”运算符可以被重载 - 不,.运算符是无法被重载的。 - Captain Obvlious
@Borgleader,几乎可以了,但不需要 ::s = "Hello "; 这个语句。例如,我会在数字中这样做,所以每次调用全局变量时,它已经增加了1个单位。在您的代码中,将“Blah”更改为“Hello”,而无需在函数内显式指定。你能理解吗? - Gabriel
显示剩余6条评论
2个回答

9

无法重载它。

与所有运算符不同,作用域运算符在运行时什么都不做,它只影响编译时名称查找,并且您不能改变它的工作方式,因为它的作用仅仅是告诉编译器在哪里查找名称。

这就是为什么您无法对其进行重载的原因。

例如:

#include <iostream>
#include <string>

std::string s = "Blah";

int main()
{
    std::string s = "World";
    ::s = "Hello ";

    std::cout << ::s << s << std::endl;

    return 0;
}

See on Coliru


8
您不能重载 :: 的原因是标准不允许。第13.5.3节中有以下规定:

以下运算符不能被重载:

. .* :: ?:


我已经知道这个,但我想问为什么。请花些时间再读一遍我的问题,谢谢。 - Gabriel
4
@GabrielMello 你问道:"但如果它不能,有人能解释一下为什么吗?" 我现在解释为什么你不能这样做是因为标准规定了不允许。 - NathanOliver
如果你想知道为什么标准这样规定,有一本旧书(C++的设计与演化)可以参考。但是这个决定已经超过20年了。 - MSalters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接