如何在 C++ 中正确定义一元运算符

How to define correctly unary operator- in C++

假设我们有这个 class 定义:

class A{
public:
    int a;
    A(int i): a(i){}
    A operator-() const { return A(- a); }     # first operator- function
};
A operator-(const A& o) { return A(- o.a); }   # second operator- function

现在,在 main 函数中,如果我写:

A a1(10);
A a2 = -a1;                # Here the first operator- function (method) is called!

但是,如果我删除了 class 中运算符-的第一个定义,则会调用第二个函数。 我想知道为什么编译器在提供第一个定义时更喜欢第一个定义。

我还想知道为什么编译器接受调用第一个函数(方法)。因为我认为该方法是 a1- 而不是 -a1 的同义词:应用该方法的对象位于运算符之前(左侧)。

从 C++ standard 开始,一元减运算符应这样定义:

T T::operator-() const;

在 class 定义中,像这样:

T operator-(const T &a);

在 class 定义之外。

现在,您的 class 中有两种定义类型,因此成员查找会按照指定的方式进行 here:

two separate lookups are performed: for the non-member operator overloads and for the member operator overloads (for the operators where both forms are permitted). Those sets are then merged with the built-in operator overloads on equal grounds as described in overload resolution. If explicit function call syntax is used, regular unqualified name lookup is performed

所以,基本上,成员查找找到 A operator-() const;,非成员查找找到 A operator-(const A& o);。重载分辨率选择A operator-() const;.