【问题标题】:'static' keyword for binary operator declarations二元运算符声明的“静态”关键字
【发布时间】:2019-06-08 23:09:59
【问题描述】:

在 C++ 中,当 LHS 是被声明的类时,二元运算符可以被一个或两个运算符覆盖。如果用两个参数声明 in 必须是非成员函数。可见在这段代码中,两个声明是相同的。

class MyClass
{
     public:
         MyClass operator+(const MyClass&);
}
MyClass operator+(const MyClass&, const MyClass&);

是否有原因后者不能作为静态成员函数完成?像这样

class MyClass
{
     public:
         static MyClass operator+(const MyClass&, const MyClass&);
}

这将使编写流输入/输出运算符更容易(我知道您可以使用friend 来声明运算符)

【问题讨论】:

  • 我假设您想要另一个答案,而不是“C++ 标准不允许它”?
  • @Someprogrammerdude 我想要的答案更像是“为什么 C++ 标准不允许这样做?”
  • (相对)容易告诉您标准中禁止这种用法的部分。要告诉您为什么不允许这样做的原因,必须查看标准委员会会议协议,或直接询问委员会。除了猜测推理之外,我们很少有人能做任何事情。
  • 输入“friend”六个字的方便程度不亚于输入“static”六个字。它们也更容易避免。

标签: c++ operator-overloading


【解决方案1】:

逻辑是a+b 可以解释为operator+(a,b) 或a.operator+(b),如果你眯着眼睛看,每一个看起来都是合理的。前者找不到任何成员函数;后者可以找到静态的,但只会将b 传递给它们。可以通过解释为a.operator+(a,b) 正确调用静态成员,但这会尝试将额外参数传递给任何非静态成员(例如,可能将一元- 转换为二进制成员)。它还会破坏允许对第一个参数进行转换的功能,因为它的(原始)类型会通过名称查找来限制候选者。

有一种情况是operator+(a,b) 可以找到一个成员函数——当运算符本身出现在一个类中时(成员函数)。对此类名称的非限定查找特别忽略了类成员,因为它们(尽管它们是非静态的)将具有错误的数量并且(通常)将用于错误的类型(隐藏 all 非成员同一个运算符的函数!)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-05
    • 2014-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多