【问题标题】:Why I cannot overload the :: operator?为什么我不能重载 :: 运算符?
【发布时间】:2015-11-13 06:06:38
【问题描述】:

我正在阅读 Stanley B. Lippman 的《C++ Primer》一书,在变量和基本类型部分我看到了范围运算符::

我已经阅读了一些关于运算符重载的内容,我认为它在特殊情况下可能非常有用,但是当我在互联网上搜索时,我发现我根本无法重载 :: 运算符。

this post 中发现. 操作符可以重载。但是,这可能会导致有关操作是针对重载. 的对象还是针对. 引用的对象的问题。

因此,我认为也许有一种方法可以重载::

但如果不能,谁能解释一下为什么?

我对 :: 运算符的想法的一个例子:

#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;
}

【问题讨论】:

  • 作用域“operator”不像所有的操作符在运行时什么都不做,它会影响编译时的名字查找,这就是为什么你不能重载它。
  • @Borgleader 我不能让它在运行时做点什么?
  • @GabrielMello 不,因为它唯一的工作就是告诉编译器在哪里可以找到名称。
  • “我发现 . 运算符可以重载” - 不,. 运算符不能重载。
  • @CaptainObvlious 但如果您看到用户所说的那个问题“原则上可以使用与 -> 相同的技术进行重载。”

标签: c++ c++11 operator-overloading


【解决方案1】:

您不能重载:: 的原因是标准禁止它。第 13.5.3 节有

以下运算符不能重载:

..*::?:

【讨论】:

  • 我已经知道了,但我在问为什么。请花点时间再次阅读我的问题,谢谢。
  • @GabrielMello 你问过But if it can't, can anyone explain me why 我正在展示你不能这样做的原因是因为标准是这样说的。
  • 如果您想知道为什么标准这么说,有一本旧书(C++ 的设计与进化)。但这个决定已有 2 多年的历史了。
【解决方案2】:

你不能超载它。

与所有运算符不同,“运算符”作用域在运行时不执行任何操作,它会影响编译时的名称查找,并且您无法更改它,因为它的工作只是告诉编译器在哪里找到名称。

这就是为什么你不能超载它。

例如:

#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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-30
    • 1970-01-01
    • 2018-03-16
    • 1970-01-01
    • 2012-03-09
    • 2011-02-07
    • 1970-01-01
    相关资源
    最近更新 更多