0

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

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

bool flag = *Get("name");

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

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

5 回答 5

2

如果我理解正确,您想要的东西可以是nullptr,truefalse.

boost 库 (www.boost.org) 有一个optional可以利用的类:

boost::optional<bool> foo;

这允许您使用 来检查空值if (!foo),如果反之为真,那么您可以使用*来恢复布尔值。

于 2014-02-27T10:48:58.347 回答
2

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

于 2014-02-27T10:43:02.843 回答
2

第一个是不正确的,因为您不能取消引用空指针。

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

bool flag = result && *result;

如果您想避免result每次调用的变量,请执行以下操作:

bool istrue(bool const *result) {
    return result && *result;
}

bool flag = istrue(Get("name"));
于 2014-02-27T11:05:44.587 回答
2

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

于 2014-02-27T10:43:24.453 回答
1

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

第二种选择是正确的。

于 2014-02-27T10:44:11.237 回答