最近,我使用了boost::logic::tribool
,这对我来说很奇怪。
#include <iostream>
#include "boost/logic/tribool.hpp"
int main()
{
boost::logic::tribool test = true && boost::logic::indeterminate;
if(test)
{
std::cout << "Executes?" << std::endl;
}
if (true && boost::logic::indeterminate)
{
std::cout << "Executes 2" << std::endl;
}
}
打印Executes
和Executes 2
。
为什么这些条件成立?
我完全确定使用(不确定状态,true)的AND运算会返回不确定状态?
boost.org引用if
中的布尔上下文
“如果三态布尔值为true,则返回true,否则返回false”
编辑:在评论之后,我要添加此内容。 这是我读过的最不直观的代码。
#include <iostream>
#include "boost/logic/tribool.hpp"
int main()
{
boost::logic::tribool test = boost::logic::tribool(true) && boost::logic::indeterminate;
if(test)
{
std::cout << "This will NOT execute" << std::endl;
}
boost::logic::tribool second = true && boost::logic::indeterminate;
if (second)
{
std::cout << "This will execute" << std::endl;
}
}
EDIT2:我需要纠正自己... 有人可以解释吗?
#include <iostream>
#include "boost/logic/tribool.hpp"
boost::logic::tribool LOL( )
{
return boost::logic::indeterminate;
}
int main()
{
boost::logic::tribool LOL_RESULT = LOL();
if (boost::logic::indeterminate)
{
std::cout << "IT WILL BE EXECUTED" << std::endl;
}
if (LOL_RESULT)
{
std::cout << "IT WILL NOT BE EXECUTED" << std::endl;
}
}
答案 0 :(得分:1)
TEST(junk, tribool)
{
auto v = boost::logic::indeterminate;
GTEST_MESSAGE() << typeid(v).name();
}
结果:
[----------] 1 test from junk
[ RUN ] junk.tribool
[ NOTE ] bool (__cdecl*)(class boost::logic::tribool,struct boost::logic::detail::indeterminate_t)
boost::logic::indeterminate
是一个函数 。因此它的评估结果为true。
TEST(junk, tribool)
{
boost::logic::tribool test = true && boost::logic::tribool{ boost::logic::indeterminate_keyword_t() };
if (test)
{
GTEST_MESSAGE() << "Executes?" << std::endl;
}
if (true && boost::logic::tribool{ boost::logic::indeterminate_keyword_t() })
{
GTEST_MESSAGE() << "Executes 2" << std::endl;
}
}
结果:
[----------] 1 test from junk
[ RUN ] junk.tribool
[ OK ] junk.tribool (64970 ms)
[----------] 1 test from junk (68580 ms total)