为什么将一个int转换为bool会发出警告?

use*_*344 14 c++ casting boolean compiler-warnings visual-c++

是不是可以使用static_cast将int转换为bool,因为它转换隐式转换的反向但我仍然收到警告?

例:

MSVC++ 8

bool bit = static_cast<bool>(100);
Run Code Online (Sandbox Code Playgroud)

Kon*_*lph 48

仅仅因为转换a => b是隐含的,没有说明反向的可行性,b => a.

在你的情况下,你根本不应该施放.做一件显而易见的事:比较:

bool result = int_value != 0;
Run Code Online (Sandbox Code Playgroud)

这是一个转换的唯一逻辑正确的方式intbool和它使代码更可读(因为它使得假设明确).

顺便提一下,这同样适用于相反的情况.从隐式转换boolint仅仅是懒惰.使映射显式:

int result = condition ? 1 : 0;
Run Code Online (Sandbox Code Playgroud)

  • @Konrad:顺便说一句,滑坡是一个逻辑*谬误,但却是一个心理上的真相.人类表现出各种时间上的不一致性,"并不比以前更糟糕"是其中之一.视觉混乱是可读性方面的问题,但我没有发现`result =(a!= b)`或`(a*b)+ c`在视觉上混乱.很明显,我们同意明确的和更短的是不屈不挠的赢家,但明确和更长时间往往优于隐含和更短.在这个例子中,我对使用和不使用parens同样感到高兴,我认为它们都是完全可读的. (6认同)
  • 请定义"正确".你的意思是,你的风格指南唯一允许的吗? (5认同)
  • 我知道这没有必要,但我个人更喜欢`bool result =(int_value!= 0);`为了便于阅读 (3认同)
  • @satuon你可以自由地做到这一点,但我避免多余的括号.它们提供了视觉混乱并降低了代码的清晰度.设计师称之为[负空间](http://en.wikipedia.org/wiki/Negative_space),这是以尽可能少的方式呈现信息的核心概念.(顺便说一下,维基百科的解释并不好.这听起来好像负空间的主要用途是制造幻象.) (3认同)

Ste*_*sop 9

这是你和你的编译器之间,但微软认为你应该写:

i != 0
Run Code Online (Sandbox Code Playgroud)

优先于:

(bool)i
Run Code Online (Sandbox Code Playgroud)

要么

static_cast<bool>(i)
Run Code Online (Sandbox Code Playgroud)

更喜欢它的可能原因包括:

  • 这种转换不像其他缩小转换那样,取模数,
  • 对bool的隐含转换也有点争议:很多人喜欢在打电话之后做if (buf != NULL)或不喜欢,if (buf != 0)if (buf)malloc
  • 比较既简短又清晰.

  • 关于你的第二点:我认为从编写测试`if(int_value)`编写测试`if(ptr_value)`是根本不同的 - 第一个是OK(在我的小世界中)因为它测试了一个*状态*有效期,而第二则不是. (2认同)
  • @Konrad:很公平.在这方面你可以有一个类似于指针的整数 - 0*是*一个特殊的占位符,意思是"没有",毕竟.但是现代算法已经把它变成了另一个值,所以你很正确,整数0通常并不像空指针那样意味着"不". (2认同)