逻辑操作员执行顺序
Logical operator execution order
我有关于操作员的超载,并带有有趣的代码:
#include <iostream>
class A {
public:
operator bool() {
return true;
}
bool operator!() {
return false;
}
};
int main() {
A a;
if (!a) {
std::cout << "HELLO";
} else {
std::cout << "WORLD";
}
std::cout << std::endl;
return 0;
}
首先叫什么,然后是什么?为什么?这是在cppreference中的任何地方描述吗?
P.S。对于下降者和其他认为我不能自己执行此代码的人。我可以。我做到了。我已经改变了很多次,以查看其行为。所以呢?这不是解释。我已经要求参考哪些明确说明该代码遵守的规则。它在我的计算机上工作的信息不会回答这个问题 - 如果这甚至在不同环境(OS,也许是处理器等)上都无法移植怎么办?
它的工作方式很简单。编译器解析源并看到if(!a)
。然后检查A
是否定义了operator!
。只是碰巧这样做。这样就被称为。
如果它已经看到if(a)
,它将检查A
可转换为可以在if
条件下使用的东西。碰巧的是,它确实是可转换的。
如果没有operator!
,则编译器会检查A
是否可以转换为可能在逻辑上被否定的东西。然后将进行转换为布尔。
顺便说一句,即使在令人惊讶的地方,转换也会发生。例如
a + 1
将编译。我认为不是我们想要的。最好只能在bool
的上下文中允许它。您可以通过标记转换运算符的明确说明来做到这一点:
explicit operator bool() {
return true;
}
!a
不超过a.operator!()
的句法糖,您已经定义了:这是编译器的首选选择。
因此,转换为bool
操作员从来都不是候选人。
您可以通过写作
来考虑后者if (!(bool)a) {
相关文章:
- QML按钮点击功能执行顺序
- C++从其他 constexpr 创建 lambda 不能按顺序执行 Constexpr
- 如何创建线程序列以按照启动顺序执行任务?
- 为什么切换 for 循环的顺序会显著改变执行时间?
- C++ - scanf() 和 printf() 执行顺序不对
- 递归函数的执行顺序
- pthread执行时间比顺序执行时间差
- 编译器是否会简化按顺序执行多次的操作
- 异步执行比顺序执行需要更长的时间
- 为什么要以相反的顺序执行RUST功能和FFI C 功能
- 是否有一种可接受的运行线程或按顺序执行的方法
- C++ 为什么 std::async 比顺序执行慢
- 如何在睡眠期间按顺序执行我的动作?(C++,威纳皮)
- 函数未按提供的顺序执行
- SIGSEGV:程序不按顺序执行
- 为什么 g++ 使我的代码以与编写不同的顺序执行,我如何禁用此"optimization"?
- 生成保证顺序执行
- 如何用c++ boost::asio顺序执行异步操作
- 以未知的顺序执行函数的最有效方法
- 并行执行比顺序执行快的示例