使用void*而不是bool是一种可行的做法吗?

qdi*_*dii 3 c++ boolean void-pointers

在讨论流时,Horstmann的C++陷阱解决了一个有趣的问题.引用他:

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

作为一名程序员,如果void*我期待一个布尔值,我会感到困惑.Horstmann提供了一个使用a void*而不是a bool似乎合适的例子.总是可取的吗?

tem*_*def 10

在一般情况下不建议这样做,并且根本不建议使用C++ 11.

转换的原因void*是支持语法

std::ifstream myStream;
if (myStream) {

}
if (!myStream) {

}
Run Code Online (Sandbox Code Playgroud)

在这里,转换bool似乎更合理,但会导致像这样的奇怪:

if (myStream == true) // ??
Run Code Online (Sandbox Code Playgroud)

转换以void*防止此代码合法,但打开了另外一堆蠕虫,如

delete myStream; // ??
Run Code Online (Sandbox Code Playgroud)

在C++ 11中,具有explicit operator bool()作为成员函数的能力,这个void*hack已被弃用,不应该被使用.不要用这个成语.如果你需要返回一个东西bool,请让它返回bool.如果您需要一个可以转换为a的对象bool,请使用explicit operator bool.

希望这可以帮助!

  • @Kerrek:是的.这是[一个突破性的变化](http://stackoverflow.com/questions/6399615/what-breaking-changes-are-introduced-in-c11),但只打破破碎的代码(`删除std :: cin`赢了再编译了. (2认同)