【问题标题】:Rationale of enforcing some operators to be members强制部分运营商成为会员的理由
【发布时间】:2011-04-25 16:19:51
【问题描述】:

C++ 中有 4 个运算符可以重载,但不能作为独立(也称为非成员、独立)函数重载。这些运算符是:

  • operator =
  • operator ()
  • operator ->
  • operator []

This thread 完美地解释了禁止 operator = 成为非成员函数的理由。对其他三个有什么想法吗?

【问题讨论】:

  • 我很确定 ->* 可以实现为非成员函数。
  • @James:你是对的。 @Armen:可能只是短视。
  • @詹姆斯。简而言之,这本书 C++ 另有说法......
  • @Armen Tsirunyan 你应该检查标准
  • @Andrey:几乎所有其他运营商都可以这么说,所以我认为这不是答案。

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


【解决方案1】:

原帖中提到的四个运算符=()->[],确实必须实现为非静态成员函数(分别由 C++98 §13.5.3/ 1、§13.5.4/1、§13.5.5/1 和 §13.5.6/1)。

Bjarne Stroustrup 的基本原理是,正如我从早先关于该主题的辩论中所记得的那样,在语言中保持一些理智,即无论其他人通过定义非成员而搞砸了多少事情,至少有一些你可以依赖的东西现有类的运算符。

我不确定我是否完全同意限制确实对此有所帮助,但是。

编辑:我就此咨询了 Bjarne Stroustrup(他总是乐于助人),但似乎规则的明显不一致只不过是冻结的历史事故。他指出“现在看起来比以前更糟了,因为自从制定了重载规则以来,我们的左值和引用规则已经发生了变化。几年前我试图再次研究这个问题,但是在产生一个完成提案。”

干杯,

PS:《The Design and Evolution of C++》这本书非常适合这类问题,可惜我没有。

【讨论】:

  • 在这种情况下, -> 和 ->* 之间的主要区别到底是什么?为什么一个不能成为非会员而另一个可以?顺便说一句,我愿意接受诸如“没有严重的原因。这是不合逻辑的,但事实就是这样”这样的答案,但如果是这样的话,我肯定会感到失望
  • @Armen:好问题。我不知道。或许这就是“The Design and Evolution”的解释,如果是这样,或许有那本书的人会插话。我查了旧的ARM,它似乎没有讨论它。
  • = 的基本原理确实在 D&E 中提出,并且一直有效。我不知道为什么()[]-> 也有此限制。
  • 至少有一些你可以依赖的东西,不管别人怎么搞砸了” 很有趣,用一种可能超载&&的语言, ||,,但随后它们失去了通常的语义,无法重新创建特殊语义。
  • @curiousguy:它确实可以在许多表达模板系统中重新创建。
【解决方案2】:

comp.std.c++ 上的 thread 讨论了这个问题。

委员会成员弗朗西斯·格拉斯伯罗 (Francis Glassborow) 表示:

语言设计者不想支持转换和 运算符 = 左侧操作数上的提升,也不是 () 和 [] 的操作数。

尽量避免以下情况:

class A {};

class B { B(A& a) {} };

int operator()(B const& b) { return 0; }


int main(void)
{
    A a;

    // This works even though A doesn't have a () operator
    // It creates a temporary B and calls operator()(B& b)
    return a();                   
}

【讨论】:

  • 尼特:您需要int operator()(B const& b) 以避免尝试将临时绑定到对非const 的引用。无论如何,Armen 关于->* 的问题仍然存在。
  • “语言设计者不想支持 () 左侧操作数的转换和提升”。然而,当一个类声明一个转换函数到指向函数的指针时,它们确实允许这样做......
  • 我不认为反对的有效性。如果Boperator() 并且可以从A 隐式创建,为什么要阻止它?
  • @GMan:见 Alf P. Steinbach 的评论,“保持理智”。
  • @MSalters:我不认为这很疯狂。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-17
  • 1970-01-01
  • 1970-01-01
  • 2017-02-12
  • 1970-01-01
相关资源
最近更新 更多