安全地返回C ++ const项,具体取决于是否存在

use*_*112 2 c++ stl

我有一个std::unordered_map<uint64_t, Object> _map,我想为客户提供一个只读的吸气剂。

本来我是这样想的:

bool foundItem(const uint64_t key, Object& object) const
{
    if(_map.find(key) != _map.end())
    {
        object = _map.at(key);
        return true;
    }
    else
    {
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是显然这不是只读的,所以我更改了签名以返回对象,并且布尔值可以通过引用传递:

const Object& foundItem(const uint64_t key, bool& found) const
{
    if(_map.find(key) != _map.end())
    {
        found = true;
        return _map.at(key);
    }
    else
    {
        found = false;
        // What can I return here??
    }
}
Run Code Online (Sandbox Code Playgroud)

但是现在,如果没有找到密钥,我将没有类型可以返回。

允许用户以只读方式访问(可能是)返回的对象的最佳方法是什么?

Lig*_*ica 11

您可以返回一个指针:

// Returns nullptr if not found
const Object* getItem(const uint64_t key) const
{
    auto it = _map.find(key);
    if (it == _map.end())
       return nullptr;

    return &it->second;
}
Run Code Online (Sandbox Code Playgroud)

或者您可以返回std::optional,或者您可以返回const Object&但在查找失败时引发异常。

在所有情况下,请小心记录结果的预期寿命。特别是,您应该注释哪些成员函数将导致函数的结果无效。通常,它将是“任何非const函数”,例如std::string::c_str()在对字符串进行变异操作之前如何有效。