【发布时间】:2025-12-28 05:00:12
【问题描述】:
代码如下: (Coliru Code)
#include <stdlib.h>
#include <iostream>
#include <iomanip>
#include <boost/logic/tribool.hpp>
struct B
{
boost::tribool boo;
void bug ()
{
bool tmp = indeterminate (boo);
std::cout << "tmp = " << std::boolalpha << tmp << "\n";
if (tmp && (boo = should_not_be_called ()) == false) {;}
}
bool should_not_be_called () const
{
std::cout << "BUG, wrong call\n";
abort ();
}
};
int main ()
{
B a;
a.bug ();
}
输出是
tmp = false
BUG, wrong call
bash: line 7: 14410 Aborted (core dumped) ./a.out
我不明白为什么在这里调用 should_not_be_call。测试的编译器是 gcc 4.9 和 clang 3.6。
更新:
我阅读了答案并将带有“if”的行更改为
if (tmp && (false == (boo = should_not_be_called ()))) {;}
(Coliru)
现在 && 运算符两边都有纯布尔类型,但我仍然遇到同样的错误。为什么?
【问题讨论】:
-
我当地的博彩公司提供的赔率为 1000:1,这是一个编译器错误。
-
在这里回答,我想:*.com/questions/628526/…
-
@NikkiChumakov 不,运算符
==也超载了。bool && (bool == tribool)将解析为bool && tribool,这将再次调用重载运算符而不是短路
标签: c++