Я только выяснил, что две функции подкачки для basic_string (функция-член и функция в пространстве имен std) не объявляются без каких-либо исключений - ни в стандартной библиотеке GCC-4.8, ни в последнем проекте С++ N3690.
С другой стороны, конструктор перемещения, а также оператор назначения перемещения объявляются без исключения. Это показывает, что должно быть возможно предоставить noexcept функции свопинга.
Вопрос: В чем причина отказа от функций подкачки без каких-либо ограничений?
Обновление: Проблема заключается в том, что я хочу использовать функцию шаблона в своих собственных функциях свопинга, которая использует static_assert для проверки того, что swap на самом деле не существует, например:
struct foo {
bar_t bar;
baz_t baz;
void swap(foo& rhs) noexcept {
swap_noexcept(bar, rhs.bar);
swap_noexcept(baz, rhs.baz);
}
};
Однако это работает только в том случае, если функции swap объявлены с noexcept, и это не относится к basic_string
.