2012-02-06 8 views
13

¿Hay alguna razón por la que unique_ptr::reset no tenga sobrecargas que tengan un const deleter& y deleter&& para hacer coincidir sus constructores que toman esos como un segundo argumento?¿Por qué unique_ptr :: reset tiene sobrecargas que toman un eliminador?

El eliminador almacenado en unique_ptr se copiaría o se movería asignado con el argumento desde reset. Si el eliminador no se puede copiar o no se puede mover, no se compilará la sobrecarga correspondiente del reset. Parece que sería un comportamiento constante con los constructores.

Respuesta

24

I pensado en añadir eso, sino que puede obtener la funcionalidad equivalente con un operador de asignación movimiento:

ptr = unique_ptr<T, D>(new T(another_value), D(another_state)); 

, así que optó por no decir la misma cosa con reset en el interés de mantener la API razonablemente pequeño.

actualización

Y vivo y aprendo ...

La sintaxis puede ser en realidad mucho más simple que lo que muestro arriba:

ptr = {new T(another_value), D(another_state)}; 
+3

+1 por tener la única respuesta autoritativa a una pregunta por qué. – ildjarn

+0

¿No sería más limpio y más consistente con shared_ptr si hubiera una función de reinicio? Para mí, se siente especialmente más limpio cuando tienes una función de eliminación personalizada. Por ejemplo: 'ptr = unique_ptr (new_raw_ptr, deleter_function);' versus 'ptr.reset (new_raw_ptr, deleter_function);'. O incluso mejor si pudiéramos mantener la misma función deleter, por lo que sería como: 'ptr.reset (new_raw_ptr);'. – felipou

+1

@felipou: este último funciona.Para el primero, así es como * usted * puede hacerlo: http://cplusplus.github.io/LWG/lwg-active.html#submit_issue –

3

Porque el eliminador se almacena en el objeto en la construcción. Como el tipo de eliminador es un argumento de plantilla, después de la construcción no hay forma de "convertir" la clase para usar otra.

+0

Así, invoque el operador de asignación de copia o mover el operador de asignación respectivamente. Si su delegado no tiene una accesible accesible, no compilará. – David

+0

¿No es eso sobreingeniería una clase que tiene un propósito simple? –

+0

Puede copiar la construcción y mover la construcción: ¿por qué agregar la capacidad de copiar asignar y mover asignar sería una sobreingeniería? Esto parece un nivel de complejidad consistente con la otra funcionalidad para mí (es decir, no es nada compleja) – David

Cuestiones relacionadas