c++ - 二元运算符声明的“static”关键字

标签 c++ operator-overloading

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

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

有没有理由不能将后者作为静态成员函数来完成?像这样

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

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

最佳答案

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

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

关于c++ - 二元运算符声明的“static”关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56506601/

相关文章:

c++ - 如何使用模板修复 'no match for ‘operator*’(操作数类型为 ‘Matrix<double, 2, 3>’ 和 ‘Matrix<double, 3, 2>’)'

c++ - 对于erase-remove 习惯用法,为什么需要第二个参数指向容器的末尾?

c++ - 如何在 Eclipse 中查看 std::map 的内容?

c++ - 使用 FFMpeg 解码 H264 帧时遇到问题

python - __lt__ 而不是 __cmp__

python - python 中的模块 `operator` 没有 `rfloordiv`?

c++ - 如何更改对 (> 和 <) 运算符的行为?

c++ - 如何将 const std::vector<unsigned char> 转换为 char

c++ - 删除 vector 容器的最后一个元素

C++ 运算符重载和保护字段