防止在 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;
}
};
我有一个派生自 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;
}
};