延伸.
当我做了类似的事情时,我以为我很酷
bool hasParent()
{
return this->parentNode ;
}
即使有(布尔)演员,警告仍然不会消失.
当没有父节点时this-> parentNode为NULL.
但是我得到了:
warning C4800: 'Node *' : forcing value to bool 'true' or 'false' (performance warning)
这是什么交易,哟?为什么这是表现警告?我认为不写下这样的东西会更有效率:
bool hasParent()
{
if( this->parentNode )
return true ;
else
return false ;
}
但第二个版本没有产生警告,编译器似乎更快乐.哪个更快?
[这个问题有关,但并不等同于这一个 ]
如果我尝试使用某些类型的值作为布尔表达式,我会收到警告.我有时使用三元运算符(?:)转换为bool 而不是抑制警告.使用两个not运算符(!!)似乎做同样的事情.
这就是我的意思:
typedef long T; // similar warning with void * or double
T t = 0;
bool b = t; // performance warning: forcing 'long' value to 'bool'
b = t ? true : false; // ok
b = !!t; // any different?
Run Code Online (Sandbox Code Playgroud)
那么,双重技术真的做同样的事吗?它比三元技术更安全吗?这是技术与非整数类型(例如,具有同样安全void *或double对T)?
我不是在问好!!t风格.我在问它是否在语义上不同于t ? true : false.
我的代码中有这个问题:
bool CBase::isNumber()
{
return (id & MID_NUMBER);
}
bool CBase::isVar()
{
return (id & MID_VARIABLE);
}
bool CBase::isSymbol()
{
return (id & MID_SYMBOL);
}
Run Code Online (Sandbox Code Playgroud) 如下所述的microsoft c ++编译器中的C4800警告:
https://msdn.microsoft.com/en-us/library/b6801kcy.aspx
制作此代码:
// C4800.cpp
// compile with: /W3
int main() {
int i = 0;
// try..
// bool i = 0;
bool j = i; // C4800
j++;
}
Run Code Online (Sandbox Code Playgroud)
抛出C4800警告:"'type':强制值为bool'true'或'false'(性能警告)"
微软似乎认为这是一个相当重要的,并将其作为Level3警告,但Clang显然认为不是这样,因为对它的最大警告水平没有任何投诉.
是否有任何人可以提出的现实世界的错误,C4800会指出这会让它值得启用吗?