gpt4 book ai didi

c++ - 否定运算符和比较

转载 作者:太空狗 更新时间:2023-10-29 19:59:24 26 4
gpt4 key购买 nike

让我们来看一些代码示例:

! 4 > 0;

从 C++ 标准我们知道,否定将首先完成,而不是比较。但是如果我们稍微扩展一下这个例子:

#include <iostream>

class Test
{
public:
bool operator!() const
{
std::cout << "operator!" << std::endl;
return false;
}

bool operator>(const int &) const
{
std::cout << "operator>" << std::endl;
return false;
}
};


int main(int argc, char * argv[])
{
Test t;
std::cout << "t > 0;" << std::endl;
t > 0;
std::cout << "! t > 0;" << std::endl;
! t > 0;
std::cout << "!t.operator>(0)" << std::endl;
! t.operator>(0);

return 0;
}

这个程序的输出将是:

t > 0;
operator>
! t > 0;
operator!
!t.operator>(0)
operator>
  1. 第一次调用(控制调用)很清楚。我们检查是否调用了我们想要的运算符。
  2. 第二次通话证明了我第一次所说的话。先调用否定运算符,然后调用结果 (bool) operator>。
  3. 第三个电话让我很困扰。

这就是我的问题。为什么 SomeObjInstance > 0 调用不同于 SomeObjInstance.operator>(0)。我知道以第二种方式(作为成员)调用运算符(operator)并不常见,但为什么这个调用不同?我一直认为 SomeObjInstance > 0 在后台被翻译成成员调用 SomeObjInstance.operator>(0) 或函数调用 bool operator>(const Test &, int) 如果成员运算符不存在。

这种行为在 C++ 标准中有描述,还是某种未定义的行为?

最佳答案

成员访问运算符.*的优先级高于取反运算符!

Where this behaviour is described in C++ standard, or maybe is this some kind of undefined behaviour?

这很可能是相关段落:

13.5 Overloaded operators [over.oper]

5) Operator functions are usually not called directly; instead they are invoked to evaluate the operators they implement (13.5.1 – 13.5.7). They can be explicitly called, however, using the operator-function-id as the name of the function in the function call syntax (5.2.2).

在您的第一个示例中 t > 0; 它将使用具有关系比较运算符优先级的相应运算符。但是,在您的第二个版本 t.operator>(0) 中,您将其用作函数调用。因此 Test::operator> 被用作成员函数,这将导致您描述的行为,因为它失去了它的运算符特征(“它们可以被显式调用,但是,使用operator-function-id 作为函数调用语法中函数的名称")。

另见:

关于c++ - 否定运算符和比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13360640/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com