【发布时间】:2020-09-10 08:56:47
【问题描述】:
我有一个从std::map 派生的容器,它包含共享指针,以及一个用于查找元素的自定义方法,类似于下面的代码。
容器在我使用时不会改变,我希望查找返回共享指针而不进行复制,并且不增加指针的计数器。我怎样才能确保这一点?
struct X;
using Xp = std::shared_ptr< X >;
struct Xs : std::map< int, Xp >
{
Xp get( int n ) const {
auto p = find( n );
return p != end() ? p->second : nullptr;
}
};
Xs xs;
void test() {
// always increments the counter of the shared_ptr :(
if( auto const& p = xs.get( 5 ) )
( void ) p;
}
编辑:我无法更改容器,也无法返回原始指针。有没有办法在不更改指针的情况下返回对指针的引用?
【问题讨论】:
-
and not increment the pointer's counter这就是智能指针的作用,否则你应该使用原始指针。 -
为什么不想复制共享指针?这就是重点,您可以拥有许多不同的共享指针副本,但它们都指向同一个对象。您的问题,就像现在一样,具有XY problem 的独特气味。
-
@Someprogrammerdude 如果您不存储副本,那将毫无意义。这是一个公平的问题。
-
您可以返回
std::weak_ptr。 -
std::weak_ptr绝对是这里的正确答案。如果您不打算添加额外的所有权,这正是std::weak_ptr存在的原因。
标签: c++ shared-ptr return-value-optimization