我有一位同事经常在条件句中进行显式强制转换,例如:
SomeType *ptr = /* some value */;
if (static_cast<bool>(ptr)) {
// do something
}
但我一直无法为这种冗长找到充分的理由。有任何想法吗?
编辑:同事说这是关于清晰和明确的,但我觉得这个解释不是很有说服力。我提出这个问题是想看看其他 C++ 专家是否推荐这个,如果是,也许会出现一个更有说服力的论点。
我有一位同事经常在条件句中进行显式强制转换,例如:
SomeType *ptr = /* some value */;
if (static_cast<bool>(ptr)) {
// do something
}
但我一直无法为这种冗长找到充分的理由。有任何想法吗?
编辑:同事说这是关于清晰和明确的,但我觉得这个解释不是很有说服力。我提出这个问题是想看看其他 C++ 专家是否推荐这个,如果是,也许会出现一个更有说服力的论点。
从广义上讲,没有客观的充分理由这样做。对于指针,它实际上是负面有用的。指针转换为bool
C++ 中定义明确的操作,自 C 时代以来(可能更早)就一直如此。这是每个 C++ 程序员都需要学习的基本习语。显式执行转换会发送消息,即显式转换与隐式上下文转换在某种程度上不同,而隐式上下文转换并非如此。
此外,不知道做什么的用户if(ptr)
也可能根本不知道将指针转换为bool
做什么。所以if(static_cast<bool>(ptr))
甚至不能被辩护为更清楚;if(ptr != nullptr)
对于新手的情况要清楚得多。
if (static_cast<bool>(ptr))
完全等价于if (ptr)
。
也许您的同事认为 usingstatic_cast
可以使代码更加清晰。
从 C++11 开始,您已经能够指定一个explicit bool
转换,该转换仅在if (myObj) { … }
诸如bool b = myObj;
. 这些语句是等效的,但您的同事可能一直试图仅在语法中提供转换的“显式”性质。总而言之,您不需要static_cast<bool>(myObj)
, 并且在 C++11 之后,您已经提供了类型安全。