1

这可能是一个愚蠢的问题,但我在阅读本文时尝试使用安全布尔成语时对编译错误感到困惑。下面是我的代码,我已经指出了 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 出现错误。两者都在运算符之前产生一个布尔值<<

4

3 回答 3

7

ok支持operator bool,并且 C++ 有一个很好的功能,称为隐式转换和提升,在这种情况下,对于二元移位运算符<<,将bool提升为 an int,然后将其移位 1。

在第二种情况下,您没有提供该运算符,因此没有任何内容可以隐式转换(和提升)为 int,并且您会收到错误消息。尝试!notOk在班次前调用,现在有一个布尔值,它将被提升。

于 2011-11-01T09:38:32.427 回答
1

我不认为编译器会自动插入一个调用operator!然后否定它来获得bool你想要的。根据我在您提供的链接中看到的内容,他们使用双重否定来进行测试,!!.

于 2011-11-01T09:37:51.053 回答
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;

移位运算符左侧的布尔值被转换为整数,然后移位。

于 2011-11-01T09:40:24.797 回答