c++ constructor move-semantics

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-id T si y solo si T está permitido por el especificación de excepción de una función invocada directamente por la definición implícita de f ; f permite todas las excepciones si cualquier función que invoca directamente permite todas las excepciones, f tiene la especificación de excepción noexcept(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.