[英]c++ error; how should i interpret its meaning?
这可能是一个愚蠢的事情要问,但我很困惑与编译错误,而试图在阅读使用安全布尔成语此文章。 以下是我的代码,并指出了在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上出错。 两者均导致<<
运算符之前的布尔值。
ok
支持operator bool
,并且C ++具有此出色的功能,称为隐式转换和提升。在这种情况下,对于二进制移位运算符<<
, bool
值被提升为int
,然后将其移位1。
在第二种情况下,您没有提供该运算符,因此没有任何隐式转换(和提升)为int的操作,并且您会得到错误。 尝试在!notOk
前致电!notOk
,现在有一个布尔值,它将被提升。
我认为编译器不会自动插入对operator!
的调用operator!
然后取而代之,以获取所需的bool
。 根据我在您提供的链接中看到的内容,他们在两次否定的情况下进行测试!!
。
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;
移位运算符左侧的布尔值将转换为int,然后进行移位。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.