std::inout_ptr_t<Smart,Pointer,Args...>::~inout_ptr_t
~inout_ptr_t();
|
(desde C++23) | |
Restablece el objeto Smart adaptado por el valor del objeto Pointer modificado (o el objeto void* si operator void**() ha sido llamado) y los argumentos capturados. Puede llamarse a release() sobre el objeto Smart adaptado si no se llama por el constructor.
Sea
sdenota el objetoSmartadaptado,args...denota los argumentos capturados,pdenota el valor delPointeralmacenado, ostatic_cast<Pointer>(*operator void**())sioperator void**ha sido llamado,SPseaSmart::pointer, si es válido y denota un tipo, de lo contrario,Smart::element_type*, siSmart::element_typees válido y denota un tipo, de lo contrario,std::pointer_traits<Smart>::element_type*, sistd::pointer_traits<Smart>::element_typees válido y denota un tipo, de lo contrario,Pointer,
/*do-release*/denotas.release()si el constructor no llama arelease(), de lo contrario, vacío.
Si Smart es un tipo puntero, el destructor ejecuta
if (p) s = static_cast<Smart>(p);, y el programa está mal formado sisizeof...(Args) > 0,
de lo contrario, si s.reset(static_cast<SP>(p), std::forward<Args>(args)...) está bien formada, el destructor ejecuta
if (p) { /*do-release*/; s.reset(static_cast<SP>(p), std::forward<Args>(args)...); },
de lo contrario, si std::is_constructible_v<Smart, SP, Args...> es true, el destructor ejecuta
if (p) { /*do-release*/; s = Smart(static_cast<SP>(p), std::forward<Args>(args)...); },
de lo contrario, el programa está mal formado.
Notas
La implementación puede asignar el almacenamiento para la estructura de datos necesaria para Smart (por ejemplo, un bloque de control) en la construcción, para dejar los trabajos de no lanzamiento al destructor.
Los argumentos capturados por valor se destruyen después del restablecimiento.