Su pregunta entonces equivale a una pregunta sobre garantías de excepción. Hay 3 tipos de garantías de excepciones (que se aplican a las funciones):
- Ninguna excepción de garantía en absoluto (no es realmente un tipo ...pero puede suceder si no le preocupa el asunto)
- Garantía de excepción básica: Técnicamente correcta, pero no Funcionalmente correcta (es decir, no se filtra ningún recurso, el programa terminará sin interrupción abrupta, pero puede no haberse deseado efectos secundarios, como el pago cobrado pero el comando no está registrado)
- Strong Exception Guarantee: Todo o nada (como una transacción), o bien todo se hace bien o retrocedemos al anterior estado.
- No Throw Exception Guarantee: Esto no tira, nunca, así que no se preocupe.
Al componer su función, por lo general, recupera las funciones existentes con sus propias garantías. Es difícil aumentar la garantía de excepción, es decir que generalmente está limitado por la garantía más débil utilizada.
W.r.su pregunta, se necesita al menos una Strong Exception Guarantee para que el objeto original no se toque si se produce una excepción.
Entonces, ¿qué ocurre si se lanza una excepción durante la construcción de movimientos? Depende de las garantías exhibidas por los objetos secundarios y la forma en que combinaba las llamadas ...
- Si se produce una excepción de un constructor, el objeto no se está construyendo y todos los subobjetos construidas se destruyen, en orden inverso. Esta regla también se aplica a un constructor de movimiento
- A menos que "ajuste" el constructor en una captura de prueba y de alguna manera restaure los objetos que se han movido, habrán perdido sus recursos. Tenga en cuenta que todavía deben estar en un estado destructible de todos modos, por lo que técnicamente el programa será correcto.
En términos de garantías excepciones, esto significa que, por defecto, si todos los constructores subobjetos al menos con los Garantía Excepción básico, entonces su movimiento constructor también lo hará, sin ningún cuidado especial.
Sin embargo, incluso si los constructores todos los subobjetos cumplen con la garantía de Excepción fuerte, es poco probable que tenga éxito en tener su propio movimiento constructor de cumplir con él, porque éste es el mismo problema que el encadenamiento de las transacciones no produce una transacción.
Si sólo uno de los constructores subobjetos puede lanzar, y se encuentra con el Garantía Excepción fuerte, entonces su movimiento constructor de forma natural se reunirá con ella misma si inicializar el objeto de lanzar primero.
Espero que esto ayudó ... excepciones son una fiera de domesticar :)
Me pregunto si esto es como el destructor, donde es sólo una mala cosa si se produce una excepción. Supongo que en la mayoría de los casos puedes moverte sin hacer nada que pueda arrojar, ya que usualmente estás moviendo punteros alrededor ... – templatetypedef
Entonces, lo que estás diciendo es que no debería haber una excepción. ser arrojado porque el estado de los miembros que se copian nunca se muta durante la operación de movimiento? –
Sorta: es similar al argumento inductivo que usas para demostrar que 'swap' no puede lanzar. Como caso base, las primitivas de reasignación y copia nunca se lanzan. Como un paso inductivo, un constructor de movimiento para un objeto con algunos miembros de datos puede mover esos miembros de datos sin tirar (¡hipótesis inductiva!), y por lo tanto puede moverse solo sin tirar. Independientemente, sin embargo, todavía quiero saber cuál es la respuesta correcta a su pregunta. – templatetypedef