gpt4 book ai didi

c++ - 在条件中使用 boost::tribool 时是编译器错误还是我的错误?

转载 作者:可可西里 更新时间:2023-11-01 15:03:04 25 4
gpt4 key购买 nike

代码如下:( 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_called。测试的编译器是 gcc 4.9 和 clang 3.6。

更新:

我阅读了答案并将带有“if”的行更改为

if (tmp && (false == (boo = should_not_be_called ()))) {;}

( Coliru )

现在 && 运算符的两边都有普通的 bool 类型,但我仍然遇到同样的错误。为什么?

最佳答案

编译器在右边。让我们分析一下您的两个 if 中涉及的类型,同时考虑所有 operator overloads that boost::tribool provides :

if (tmp && (boo = should_not_be_called ()) == false) {;}

if (bool && (tribool = bool) == bool) {;} // = is overloaded to return tribool
if (bool && tribool == bool) {;} // == is overloaded to return tribool
if (bool && tribool) {;} // && is overloaded

第二个if:

if (tmp && (false == (boo = should_not_be_called ()))) {;}

if (bool && (bool == (tribool = bool))) {;} // = is overloaded to return tribool
if (bool && (bool == tribool)) {;} // == is overloaded to return tribool
if (bool && tribool) {;} // && is overloaded

在这两种情况下,我们都以重载的 operator && 结束。运算符重载是不遵守内置运算符的特殊调用行为的函数。也就是说,用户重载的&&||不会短路,而用户重载的保证操作数的评估顺序。这三个函数都以未指定的顺序评估它们的所有操作数,就像任何其他函数调用一样。

这正是强烈反对重载 &&||, 的原因,如果你想让它们表示类似“和”、“或”和“序列”的东西。


问题原文摘录:

编译器在右边。 boost::tribool重载了opeator !,即&&的操作数类型为boolboost::triboolboost::tribool 还为这些参数类型重载了 operator &&,因此会调用此重载。

关于c++ - 在条件中使用 boost::tribool 时是编译器错误还是我的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27235555/

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