4

我有一位同事经常在条件句中进行显式强制转换,例如:

SomeType *ptr = /* some value */;
if (static_cast<bool>(ptr)) {
    // do something
}

但我一直无法为这种冗长找到充分的理由。有任何想法吗?

编辑:同事说这是关于清晰和明确的,但我觉得这个解释不是很有说服力。我提出这个问题是想看看其他 C++ 专家是否推荐这个,如果是,也许会出现一个更有说服力的论点。

4

3 回答 3

3

从广义上讲,没有客观的充分理由这样做。对于指针,它实际上是负面有用的。指针转换为boolC++ 中定义明确的操作,自 C 时代以来(可能更早)就一直如此。这是每个 C++ 程序员都需要学习的基本习语。显式执行转换会发送消息,即显式转换与隐式上下文转换在某种程度上不同,而隐式上下文转换并非如此。

此外,不知道做什么的用户if(ptr)也可能根本不知道将指针转换为bool做什么。所以if(static_cast<bool>(ptr))甚至不能被辩护为更清楚;if(ptr != nullptr)对于新手的情况要清楚得多。

于 2019-11-02T20:08:20.043 回答
2

if (static_cast<bool>(ptr))完全等价于if (ptr)

也许您的同事认为 usingstatic_cast可以使代码更加清晰。

于 2019-11-02T19:49:14.707 回答
0

从 C++11 开始,您已经能够指定一个explicit bool转换,该转换仅在if (myObj) { … }诸如bool b = myObj;. 这些语句是等效的,但您的同事可能一直试图仅在语法中提供转换的“显式”性质。总而言之,您不需要static_cast<bool>(myObj), 并且在 C++11 之后,您已经提供了类型安全。

于 2019-11-02T23:33:58.140 回答