为什么我得到的是 "C4800: 'int': forcing value to bool" 所有 bool 值?

Why am I getting "C4800: 'int': forcing value to bool" with ALL bool values?

我收到此 C4800 警告,它指向一行没有与之关联的 int 值的代码:

CO.Value = (GE_DUAL.Value & GE_SINGLE.Value) | (!GE_DUAL.Value & !IN_TMR.Value);

每个 .Value 属性 都是 bool 类型。

我正在使用 VS2015、C++/CLI,并且在我的代码中没有发现对 win32 类型的引用 BOOL,尽管我已经派生了我自己的类型 BOOL,其中每个属性都是从中转换而来的。

我在这个项目中有 200 多个其他 .cpp 文件,其中包含数千行类似代码,但我只收到这一行的警告。

与其说是担心,不如说是好奇,我可以使用逻辑运算符轻松消除错误 (见下文) ,但如果有人有任何想法,我想听听他们。 我在发帖前确实搜索了这个错误,但从未得到满意的答案(大多数人都在使用 int类型和转换问题。)

CO.Value = (GE_DUAL.Value && GE_SINGLE.Value) || (!GE_DUAL.Value && !IN_TMR.Value);

向下三行我有这条线:

DUAL.Value = GE_DUAL.Value & !IN_TMR.Value;

没有收到警告... 以下是所涉及代码的更完整列表:

public ref class BOOL : IPS::Properties::Bool
{
public:
  BOOL() : Bool() {}
  BOOL(bool val) : Bool() { Value = val;}
  operator bool() { return (bool)ValueAsObject;}
  BOOL(BOOL% b) { m_Value = b.m_Value;}
};

...

  BOOL^             m_IN_TMR;
  BOOL^             m_GE_DUAL;
  BOOL^             m_GE_SINGLE;
  BOOL^             m_CO;

...

  virtual property BOOL%  IN_TMR
  {
    BOOL% get();
    void set(BOOL% val);
  }
  virtual property BOOL%  GE_DUAL
  {
    BOOL% get();
    void set(BOOL% val);
  }
  virtual property BOOL%  GE_SINGLE
  {
    BOOL% get();
    void set(BOOL% val);
  }      
  virtual property BOOL%  CO
  {
    BOOL% get();
    void set(BOOL% val);
  }

...

void _TR_VOTE_MODE::IN_TMR::set(BOOL% val)
{
  m_IN_TMR = %val;
}  
BOOL% _TR_VOTE_MODE::GE_DUAL::get()
{
  return *m_GE_DUAL;
}
void _TR_VOTE_MODE::GE_DUAL::set(BOOL% val)
{
  m_GE_DUAL = %val;
}  
BOOL% _TR_VOTE_MODE::GE_SINGLE::get()
{
  return *m_GE_SINGLE;
}
void _TR_VOTE_MODE::GE_SINGLE::set(BOOL% val)
{
  m_GE_SINGLE = %val;
}  
BOOL% _TR_VOTE_MODE::CO::get()
{
  return *m_CO;
}

...

CO.Value = CI.Value;
if ( CI.Value )
{
  CO.Value = (GE_DUAL.Value & GE_SINGLE.Value) | (!GE_DUAL.Value & !IN_TMR.Value); // Warning C4800??
  if ( CO.Value )
  {
    TMR.Value = IN_TMR.Value;
    DUAL.Value = GE_DUAL.Value & !IN_TMR.Value;
    SINGL.Value = GE_SINGLE.Value & !GE_DUAL.Value;
    ZERO.Value = ! GE_SINGLE.Value;
  }
  else
  {
    U.Value = ReportBadParam(0);
    TMR.Value = false;
    DUAL.Value = false;
    SINGL.Value = false;
    ZERO.Value = false;
  }
}

更新 我做了一些测试,发现这行代码即使在我的其他 10 几千行代码中也是独一无二的,尽管看起来不太可能。这只是一个仅使用算术运算符的问题。我认为相似的所有其他行都包含某种逻辑运算符(与算术混合)

似乎是这部分行:

(GE_DUAL.Value & GE_SINGLE.Value) ===> int

因为那是算术,另一部分是逻辑:

(!GE_DUAL.Value & !IN_TMR.Value) ===> bool

因此整行被隐式转换为 int:

(GE_DUAL.Value & GE_SINGLE.Value) | (!GE_DUAL.Value & !IN_TMR.Value)

{bool} != {{int} | {bool}};
 {int} == {{int} | {bool}};

I am getting this C4800 warning and it points to a line of code that has NO int values associated with it

位运算为arithmetic operators and boolean operands are implicitly converted to int due to integral promotionint 类型操作数的算术运算结果也是 int.

至于为什么 MS 编译器在一种情况下会生成此类警告而在其他情况下不会,我只能猜测它只能在某些情况下预测值。