我可以将 nullptr 存储到布尔值吗?

Can I store nullptr to bool?

本文关键字:布尔值 存储 nullptr 我可以      更新时间:2023-10-16

我有一个函数,它返回一个指针,指向给定名称的 bool 类型的对象。如果未找到该对象,则返回nullptr

现在我想将一个变量设置为返回的布尔值,如果未找到,则为 false。我可以这样写吗?

bool flag = *Get("name");

这是否等同于这个更长的实现?

bool *result = Get("name");
bool flag = result == nullptr ? false : *result;

第一个不正确,因为您无法取消引用空指针。

第二个是正确的,但简化为:

bool flag = result && *result;

如果要避免每次调用的 result 变量,请按如下所示执行:

bool istrue(bool const *result) {
    return result && *result;
}
bool flag = istrue(Get("name"));

不,它不等同。在第一种情况下,如果方法返回 nullptr,则可能会收到运行时错误。

这不是等价的。在第一种情况下,您正在尝试取消引用nullptr这将崩溃,而在第二种情况下,您首先进行适当的检查。

如果我

理解正确,你想要一些可以nullptrtruefalse的东西。

提升库 (www.boost.org) 有一个 optional 类,您可以利用它:

boost::optional<bool> foo;

这允许您使用 if (!foo) 检查空性,如果相反的情况为真,则使用 * 来恢复布尔值。

两者并不等同。第一个实现将导致分段错误(因为您将尝试取消引用 NULL 指针)。

第二种选择是正确的。