3

我正在尝试获取一个函数来从我的地图中返回一个可选值。所以是这样的:

boost::optional<V> findValue(const K& key) {
    boost::optional<V> ret;
    auto it = map.find(key);
    if (it != map.end()) {
        ret = it->second;
    }
    return ret;
}

如果V碰巧是shared_ptr某种类型,那么分配是否会ret触发引用计数?

4

2 回答 2

5

是的,它必须。boost::optional存储一个副本,因此对于 a shared_ptr,这意味着有一个副本shared_ptr并且这意味着必须增加引用计数。

请注意,只要 为boost::optional空,即它不包含 的值shared_ptr,就没有对象的引用计数被摆弄。换句话说,空boost::optional不包含 (empty or else )shared_ptr

请求的“语义”不能真正起作用,因为您shared_ptr在地图中保留了一个并返回一个shared_ptr.

但是,您可以返回boost::optional<const V&>

boost::optional<const V&> findValue(const K& key) {
    auto it = map.find(key);
    if (it != map.end()) {
        return boost::optional<const V&>( it->second );
    }
    return boost::optional<const V&>();
}

但请确保参考在您保留/使用时保持有效。

于 2013-04-05T16:58:52.667 回答
1

是的。复制共享指针,在这种情况下,通过复制初始化optional对象中包含的指针,将增加使用计数。

于 2013-04-05T16:58:29.323 回答