我正在尝试使用函数从地图中返回可选值。所以像这样:
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
的分配是否会触发引用计数?
答案 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
对象中包含的指针)将增加使用计数。