boost :: optional是否会触发shared_ptr上的引用计数?

时间:2013-04-05 16:56:12

标签: c++ boost shared-ptr

我正在尝试使用函数从地图中返回可选值。所以像这样:

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的分配是否会触发引用计数?

2 个答案:

答案 0 :(得分:5)

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

请注意,只要boost::optional为空,即它不包含值shared_ptr,就没有对象的引用计数被摆弄。换句话说,空boost::optional 包含(空或其他)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&>();
}

但请确保在保留/使用时引用仍然有效。

答案 1 :(得分:1)

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