c++ - dev - ¿Por qué es basic_string:: swap not noexcept?
c++17 (1)
Acabo de descubrir que las dos funciones de intercambio para basic_string (función miembro y función en namespace std) no se declaran con noexcept , ni en la biblioteca estándar de GCC-4.8 ni en el borrador más reciente de C ++ N3690.
Por otro lado, el constructor de movimientos y el operador de asignación de movimientos se declaran con noexcept . Eso demuestra que debería ser posible proporcionar funciones de intercambio de noexcept .
Pregunta: ¿Cuál es la razón para no tener las funciones de intercambio declaradas con noexcept ?
Actualización: el problema es que quiero usar una función de plantilla dentro de mis propias funciones de intercambio, que usa static_assert para verificar que el intercambio sea en realidad no válido , por ejemplo:
struct foo {
bar_t bar;
baz_t baz;
void swap(foo& rhs) noexcept {
swap_noexcept(bar, rhs.bar);
swap_noexcept(baz, rhs.baz);
}
};
Sin embargo, eso funciona solo si las funciones de intercambio se declaran con noexcept , y ese no es el caso para basic_string .
El párrafo 21.4.6.8 de la norma C ++ 11 especifica:
21.4.6.8
basic_string::swap[string :: swap]
void swap(basic_string& s);1 Condición posterior : * esto contiene la misma secuencia de caracteres que estaba en s, s contiene la misma secuencia de caracteres que estaba en * esto.
2 tiros : nada .
3 Complejidad : tiempo constante.
Por lo tanto, uno debe concluir que la ausencia de noexcept es un descuido.
El párrafo 21.4.6.3 da otra pista sobre la función miembro de assign() :
basic_string& assign(basic_string&& str) noexcept;Efectos : La función reemplaza la cadena controlada por
*thiscon una cadena de longitudstr.size()cuyos elementos son una copia de la cadena controlada porstr. [ Nota: una implementación válida esswap(str). - nota final]3 Devoluciones :
*this.
Si se supone que swap(str) es una implementación válida para assign() , y assign() se marca como incondicionalmente noexcept , entonces tiene sentido asumir que swap() es noexcept .