shared_ptr <> es a weak_ptr <> como unique_ptr <> es a ... ¿qué?

En C ++ 11, puedes usar unshared_ptr<> establecer una relación de propiedad con un objeto o variable yweak_ptr<> para hacer referencia segura a ese objeto de una manera no propia.

También puedes usarunique_ptr<> Establecer una relación de propiedad con un objeto o variable. Pero, ¿qué pasa si otros objetos que no son propietarios también quieren hacer referencia a ese objeto?weak_ptr<> no es útil en este caso Los punteros sin procesar son útiles, pero traen varias desventajas (por ejemplo, pueden serSe inicializa automáticamente a nullptr pero esto se logra a través de técnicas que no son consistentes con elstd::*_ptr<> tipos).

¿Cuál es el equivalente deweak_ptr<> para referencias no propietarias a objetos de propiedad a través deunique_ptr<>?

Aquí hay un ejemplo de clarificación que se parece a algo en un juego en el que estoy trabajando.

class World
{
public:

    Trebuchet* trebuchet() const { return m_trebuchet.get(); }

private:
    std::unique_ptr< Trebuchet > m_trebuchet;
};

class Victim
{
public:
    Victim( Trebuchet* theTrebuchet ) : m_trebuchet( theTrebuchet ) {}

    ~Victim()
    {
        delete m_trebuchet;     // Duh. Oops. Dumb error. Nice if the compiler helped prevent this.
    }

private:

    Trebuchet* m_trebuchet;    // Non-owning.
};

shared_ptr< Victim > createVictim( World& world )
{
    return make_shared< Victim >( world.trebuchet() );
}

Aquí utilizamos un puntero en bruto para mantener una relación no propietaria con un objeto de propiedad a través deunique_ptr<> en otra parte. Pero es crudo lo mejor que podemos hacer?

La esperanza es un tipo de puntero que:

Parece que los otros tipos de punteros modernos. P.ej.std::raw_ptr<T>.Reemplaza los punteros sin formato para que pueda encontrar una base de código que use tipos de punteros modernos en todotodos punteros a través de una búsqueda de_ptr< (aproximadamente).Se inicializa automáticamente a nullptr.

Así:

int* p;                  // Unknown value.
std::raw_ptr< int > p;   // null.

¿Este tipo ya existe en C ++ ahora, se propone para el futuro o es otra implementación ampliamente disponible en, por ejemplo, ¿Aumentar?

Respuestas a la pregunta(7)

Su respuesta a la pregunta