如何在 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;
.
假设我们有这个 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;
.