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
*this
con 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
.