这可能是一个愚蠢的问题,但在阅读this文章时尝试使用安全bool习语时,我对编译错误感到困惑。下面是我的代码,我已经指出了我在main()函数中出错的行。
// is OK case
class BoolVer_OK {
bool m_OK;
public:
BoolVer_OK(bool ok) : m_OK(ok){}
operator bool() { return m_OK; }
};
// Not OK Case
class BoolVer_NotOK {
bool m_notOK;
public:
BoolVer_NotOK(bool ok) : m_notOK(!ok){}
bool operator !() const{ reportexecution; return !m_notOK; }
};
main()
{
BoolVer_OK ok(true);
BoolVer_NotOK notOK(true);
ok<<1; // Line#1 is valid
notOK << 1; // Line#2: error: inavlid operand to binary expression ('BoolVer_notOK' and 'int')
return 0;
}
当我们到达#Line2时,为什么我们在#Line1没有收到错误。两者都会导致<<
运算符之前的布尔值。
答案 0 :(得分:7)
ok
支持operator bool
,C ++有一个很好的功能,称为隐式转换和升级,在这种情况下,对于二元移位运算符<<
,bool
是提升为int
,然后将其移至1.
在第二种情况下,您没有提供该运算符,因此没有任何内容可以隐式转换(和提升)为int,并且您得到错误。尝试在班次之前调用!notOk
,现在有一个bool,它将被提升。
答案 1 :(得分:1)
我认为编译器不会自动插入对operator!
的调用,然后否定该调用以获得您想要的bool
。根据我在您提供的链接中看到的内容,他们通过双重否定!!
进行测试。
答案 2 :(得分:1)
ok<<1; // Line#1 is valid
notOK << 1; // Line#2: error: inavlid operand to binary expression ('BoolVer_notOK' and 'int')
这是因为ok被隐式转换为bool
(重载运算符),而notOK没有该运算符。
测试以下代码:
BoolVer_OK ok(true);
BoolVer_NotOK notOK(true);
int z = ok<<1; // is valid
//notOK << 1; // error: inavlid operand to binary expression ('BoolVer_notOK' and 'int')
int x = false << 1;
return 0;
移位运算符左侧的布尔值转换为整数然后移位。