【问题标题】:Is using void* instead of bool an advisable practice?使用 void* 而不是 bool 是一种可取的做法吗?
【发布时间】:2012-02-26 10:32:17
【问题描述】:

Horstmann’s C++ pitfalls 在谈论流时解决了一个有趣的问题。引用他的话:

使用转换为void*,而不是转换为intbool,来实现产生真值的对象。与intbool不同,void*除了==比较之外没有任何合法操作。

作为一名程序员,如果某个函数在我期望一个布尔值时返回 void*,我会感到困惑。 Horstmann 提供了一个示例,其中使用 void* 而不是 bool 似乎是合适的。它总是可取的吗?

【问题讨论】:

标签: c++ boolean void-pointers


【解决方案1】:

一般情况下不建议这样做,对于 C++11,根本不建议这样做。

转换为void*的原因是为了支持类似的语法

std::ifstream myStream;
if (myStream) {

}
if (!myStream) {

}

在这里,转换为bool 似乎更合理,但会导致如下异常:

if (myStream == true) // ??

转换为void* 会阻止此代码合法化,但会打开另外一罐蠕虫,例如

delete myStream; // ??

在 C++11 中,由于能够将 explicit operator bool() 作为成员函数,因此该 void* hack 已被弃用且不应使用。不要使用这个成语。如果您需要返回bool,让它返回bool。如果您需要可以转换为bool 的对象,请使用explicit operator bool

希望这会有所帮助!

【讨论】:

  • C++11 中istream 的定义是否已更改以使用此新功能?
  • @Kerrek:是的。它是a breaking change,但它只会破坏损坏的代码(delete std::cin 将不再编译)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-03
  • 1970-01-01
  • 1970-01-01
  • 2010-11-19
  • 2014-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多