繁体   English   中英

C ++错误; 我应该如何解释其含义?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM