C++ 如何用现代C++;指的是没有表示所有权的关系?

C++ 如何用现代C++;指的是没有表示所有权的关系?,c++,pointers,reference,smart-pointers,C++,Pointers,Reference,Smart Pointers,从“一个人不应该使用原始指针”这一成语出发,我研究了智能指针,以找出哪一个最适合这种关系 所谓关系,我的意思与此代码相同: class A { public: A(B & b) : m_refB( b ) { } private: B & m_refB; // A refers to B }; 但是没有使用引用的所有缺点(以后不能绑定、不能重新分配、不能再默认构造等) 然而,每个智能指针在其自身的语义中都表达了所有权概

从“一个人不应该使用原始指针”这一成语出发,我研究了智能指针,以找出哪一个最适合这种关系

所谓关系,我的意思与此代码相同:

class A
{
public:

    A(B & b) : 
        m_refB( b ) 
    {   }

private:

    B & m_refB;    // A refers to B
};
但是没有使用引用的所有缺点(以后不能绑定、不能重新分配、不能再默认构造等)

然而,每个智能指针在其自身的语义中都表达了所有权概念。它们甚至是围绕这个所有权概念命名的(当所有权仅对一个对象唯一时为唯一指针,当所有权在多个对象之间共享时为共享指针等)

我想表达的是,A指的是B,但A并不拥有B。
std::reference\u wrapper
能完成这项工作吗?否则这将是一个错误的用法吗?

这就是a的用途。它表示它指的是某物,但它不拥有它,并且在指它的对象消失之前,该事物可能消失

如果您决定需要引用的对象,您可以使用该对象,它将向对象返回一个,并延长对象的生存期,直到
共享\u ptr
超出范围。

这就是a的用途。它表示它指的是某物,但它不拥有它,并且在指它的对象消失之前,该事物可能消失

如果您决定需要引用的对象,您可以使用该对象,它将返回一个到该对象并延长其生存期,直到
共享的\u ptr
超出范围。

没有“不应使用原始指针”这样的事情。它是“一个人不应该使用拥有原始指针”。为引用的习语指定一个原始指针并没有什么错。对于这一点,智能指针只是一种过火的手段。尤其是
std::weak_ptr
:)

没有“不应该使用原始指针”这样的事情。它是“一个人不应该使用拥有原始指针”。为引用的习语指定一个原始指针并没有什么错。对于这一点,智能指针只是一种过火的手段。特别是
std::weak\u ptr
:)

我认为提供的很好,我自己也投了赞成票

但是,如果您确实不想在代码中看到原始指针,那么您可以始终创建一个包装器类,用于传递所需的语义

例如:

/**
 * A class that refers to an existing object instance. This class does not own
 * the existing object instance and the lifetime of the existing object instance
 * must be greater than the lifetime of instantiations of this class.
 */
template<typename T>
class Handle
{
public:
    Handle(T& object) : mObject(&object) {}

    // ... other functions necessary to use this object ...

private:
    T* mObject;
};
/**
*引用现有对象实例的类。这个类不拥有
*现有对象实例和现有对象实例的生存期
*必须大于此类实例化的生存期。
*/
样板
类句柄
{
公众:
句柄(T&object):mObject(&object){}
//…使用此对象所需的其他函数。。。
私人:
T*mObject;
};
我认为提供的很好,我自己也投了赞成票

但是,如果您确实不想在代码中看到原始指针,那么您可以始终创建一个包装器类,用于传递所需的语义

例如:

/**
 * A class that refers to an existing object instance. This class does not own
 * the existing object instance and the lifetime of the existing object instance
 * must be greater than the lifetime of instantiations of this class.
 */
template<typename T>
class Handle
{
public:
    Handle(T& object) : mObject(&object) {}

    // ... other functions necessary to use this object ...

private:
    T* mObject;
};
/**
*引用现有对象实例的类。这个类不拥有
*现有对象实例和现有对象实例的生存期
*必须大于此类实例化的生存期。
*/
样板
类句柄
{
公众:
句柄(T&object):mObject(&object){}
//…使用此对象所需的其他函数。。。
私人:
T*mObject;
};

std::weak\u ptr
不拥有ownership@Danh
std::weak_ptr
是否强制要求对同一资源使用
std::shared_ptr
。看我的答案,是的。但是,在某些情况下,使用弱ptr检查其状态是否有效应该是好的,我还建议SergeyA
std::弱ptr
不要拥有ownership@Danh
std::weak_ptr
是否强制要求对同一资源使用
std::shared_ptr
,确实如此,这就是为什么我不主张这样做。看我的答案,是的。但是,在某些情况下,使用弱ptr检查其状态是否有效应该是好的,我还建议使用SergeyA的…但是在实际检查对象时暂时拥有该对象。更糟糕的是,它需要一个共享的ptr存在于某处……但在它实际检查对象时,它确实暂时拥有该对象。更糟糕的是,它需要一个共享的ptr存在于某处。但我们已经拥有了。“还是太重了?”我无法回答。我只是没有完全意识到所有新的
C++
东西,所以也许我无意中重新发明了轮子。谢谢,我会看一下
std::reference\u wrapper
。还有,虽然我不知道它是否能进入标准库。但是我们已经有了。“还是太重了?”我无法回答。我只是没有完全意识到所有新的
C++
东西,所以也许我无意中重新发明了轮子。谢谢,我将看一看
std::reference\u wrapper
。还有一个,虽然我不知道它是否能进入标准库。但是一个原始指针看起来可能有异味。读者无法区分坏代码/惰性代码/泄漏代码和可分配/可空/不拥有引用的意图。我希望我能在GSL non_owning中找到,但一个原始指针看起来可能是一股难闻的气味。读者无法区分坏代码/惰性代码/泄漏代码和可分配/可空/不拥有引用的意图。我希望我能在GSL找到非拥有的。