Mientras yo entiendo por qué no hay operator==
para shared_ptr
y unique_ptr
, me pregunto por qué no hay ninguno de shared_ptr
y weak_ptr
. Especialmente dado que puede crear un weak_ptr
a través de una referencia en shared_ptr
. Supongo que durante el 99% del tiempo desea lhs.get() == rhs.get()
. Ahora avanzaría y lo introduciría en mi código a menos que alguien me diga una buena razón, por qué uno no debería hacer tal cosa.igualdad perdido entre shared_ptr y weak_ptr
Respuesta
weak_ptr
doesn 'tiene un método get()
porque debe bloquear explícitamente el weak_ptr
antes de poder acceder al puntero subyacente. Hacer esto explícito es una decisión de diseño deliberada. Si la conversión fuera implícita, sería muy fácil escribir un código que no sería seguro si se destruyera el último shared_ptr
del objeto, mientras que el puntero subyacente obtenido del weak_ptr
todavía estaba siendo examinado.
This boost page tiene una buena descripción de las trampas y por qué weak_ptr
tiene una interfaz tan limitada.
Si necesita hacer una comparación rápida, puede hacer shared == weak.lock()
. Si la comparación es verdadera, entonces usted sabe que weak
debe seguir siendo válida ya que tiene un shared_ptr
por separado para el mismo objeto. No hay tal garantía si la comparación devuelve falso.
Llamar 'lock' para una parte más grande del código realmente tiene más sentido. Buena decisión de diseño. – abergmeier
Porque tiene un costo.
A weak_ptr
es como un observador, no un puntero real. Para hacer cualquier trabajo con él, primero debe obtener un shared_ptr
usando su método lock()
.
Esto tiene el efecto de adquirir la propiedad, pero es tan costoso como copiar un shared_ptr
normal (incremento de cuenta, etc.) por lo que no es nada trivial.
Como tal, al no proporcionar ==
, se ve obligado a dar un paso atrás y realmente comprobar si realmente lo necesita o no.
No estoy seguro de que comparar las necesidades de igualdad con la validez, y como tal podría implementarse de forma económica: o bien 'weak_ptr' se refiere a la misma entidad, en cuyo caso debe ser válida (o 0), o se refiere a otra entidad, en cuyo caso no nos importa si es válida. –
@KonradRudolph: tal vez, tal vez no. Pero debido a que la obtención del puntero sería inseguro en general (ya que tendría el puntero pero no podría acceder al puntero), no puede obtener el puntero de 'weak_ptr' y se ve obligado a pasar por' shared_ptr'. Entonces ... –
No, obtener el puntero es seguro, siempre que se haga * internamente *. –
- 1. C++ shared_ptr operador de igualdad
- 2. boost :: python y weak_ptr: cosas que desaparecen
- 3. ¿Cómo funciona weak_ptr?
- 4. static_pointer_cast para weak_ptr
- 5. Igualdad entre dos enumerables
- 6. Igualdad entre 2 HashMap
- 7. asignación de mapa y shared_ptr entre aplicaciones C# y C++?
- 8. ¿Debo convertir shared_ptr en weak_ptr cuando se pasa a un método?
- 9. Cómo resolver un conflicto entre boost :: shared_ptr y using std :: shared_ptr?
- 10. Diferencia entre boost :: shared_ptr y std :: shared_ptr del archivo estándar <memory>
- 11. std :: shared_ptr y inicializador
- 12. QList y shared_ptr
- 13. impulso shared_ptr y 'esto'
- 14. Diferencias entre los diferentes sabores de shared_ptr
- 15. Boost shared_ptr desreferencia costo
- 16. orden de clasificación de boost :: weak_ptr after expiring?
- 17. ¿Puedo obtener un puntero sin formato del weak_ptr de boost?
- 18. Scala, Java y la igualdad
- 19. comparación de igualdad entre múltiples variables
- 20. Prueba de igualdad entre diccionarios en C#
- 21. java.lang.Class y la igualdad
- 22. por qué no puedo echar a nullptr weak_ptr <>
- 23. impulso serializar y std :: shared_ptr
- 24. shared_ptr y el puntero this
- 25. shared_ptr y referencias en C++
- 26. Creando un archivo seguro sin hilos shared_ptr
- 27. ¿por qué weak_ptr puede romper la referencia cíclica?
- 28. puntero sin formato C++ y std :: shared_ptr
- 29. com.google.android.maps perdido?
- 30. WiX: valor de propiedad perdido entre InstallUISequence e InstallExecuteSequence
Pero 'weak_ptr' no tiene un método' get'. –
Derp. Leer mal la pregunta –