versiones dev compiler c++ c++11

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 longitud str.size() cuyos elementos son una copia de la cadena controlada por str . [ Nota: una implementación válida es swap(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 .