c++ - ¿El constructor Move predeterminado está definido como noexcept?
move-semantics (1)
Creo que la respuesta es 15.4 / 14 (especificaciones de excepción):
Un constructor heredero (12.9) y una función de miembro especial declarada implícitamente (Cláusula 12) tienen una especificación de excepción . Si
f
es un constructor heredado o un constructor predeterminado declarado implícitamente, copy constructor, move constructor , destructor, copy assignment operator o move assignment operator, su especificación de excepción implícita especifica el type-idT
si y solo siT
está permitido por el especificación de excepción de una función invocada directamente por la definición implícita def
;f
permite todas las excepciones si cualquier función que invoca directamente permite todas las excepciones,f
tiene la especificación de excepciónnoexcept(true)
si cada función que invoca directamente no permite excepciones.
Básicamente, hace lo que crees, y el constructor de movimientos implícitamente declarado es noexcept
siempre que sea posible.
Parece que un vector verificará si el constructor de movimientos está etiquetado como noexcept antes de decidir si mover o copiar elementos al reasignarlos. ¿El constructor de movimiento predeterminado está definido como noexcept? Vi la siguiente documentación pero no especificó esto. http://en.cppreference.com/w/cpp/language/move_constructor
Constructor de movimientos implícitamente declarado
Si no se proporcionan constructores de movimiento definidos por el usuario para un tipo de clase (estructura, clase o unión), y todo lo siguiente es verdadero: no hay constructores de copia declarados por el usuario; no hay operadores de asignación de copias declarados por el usuario; operadores de asignación de movimiento declarados por el usuario no hay destructores declarados por el usuario el constructor de movimiento declarado implícitamente no se define como eliminado debido a las condiciones detalladas en la siguiente sección, entonces el compilador declarará un constructor de movimiento como miembro público en línea de su clase con el firma T :: T (T &&) Una clase puede tener múltiples constructores de movimiento, por ejemplo, tanto T :: T (const T &&) como T :: T (T &&). Si están presentes algunos constructores de movimiento definidos por el usuario, el usuario puede forzar la generación del constructor de movimiento declarado implícitamente con la palabra clave predeterminada.