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