防止在 return 上复制共享指针

Prevent copy of shared pointer on return

我有一个派生自 std::map 的容器,它包含共享指针,以及一个用于查找元素的自定义方法,类似于下面的代码。

容器在我使用时不会改变,我希望在不创建副本的情况下查找 return 共享指针,并且不增加指针的计数器。我怎样才能确保这一点?

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;
}

编辑:我无法更改容器,也无法 return 原始指针。有没有办法在不更改指针的情况下 return 对指针的引用?

您可以使用空对象来允许 return 引用:

struct Xs : std::map< int, Xp >
{
  const Xp& get( int n ) const {
    static const Xp nullObject{nullptr};
    auto p = find( n );
    return p != end() ? p->second : nullObject;
  }
};