我有一个函数,它返回一个指向给定名称的 bool 类型对象的指针。如果找不到对象,nullptr
则返回。
现在我想将一个变量设置为返回的布尔值,如果没有找到,则设置为 false。我可以这样写吗?
bool flag = *Get("name");
这是否等同于这个更长的实现?
bool *result = Get("name");
bool flag = result == nullptr ? false : *result;
如果我理解正确,您想要的东西可以是nullptr
,true
或false
.
boost 库 (www.boost.org) 有一个optional
可以利用的类:
boost::optional<bool> foo;
这允许您使用 来检查空值if (!foo)
,如果反之为真,那么您可以使用*
来恢复布尔值。
不,它不等效。在第一种情况下,如果您的方法返回 nullptr,您可能会收到运行时错误。
第一个是不正确的,因为您不能取消引用空指针。
第二个是正确的,但简化为:
bool flag = result && *result;
如果您想避免result
每次调用的变量,请执行以下操作:
bool istrue(bool const *result) {
return result && *result;
}
bool flag = istrue(Get("name"));
这不是等价的。在第一种情况下,您试图取消引用nullptr
会崩溃,而在第二种情况下,您首先进行适当的检查。
两者不等价。第一个实现将导致分段错误(因为您将尝试取消引用 NULL 指针)。
第二种选择是正确的。