Почему basic_string:: swap не noexcept?
Я только выяснил, что две функции подкачки для 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
.
Ответы
Ответ 1
В пункте 21.4.6.8 стандарта С++ 11 указывается:
21.4.6.8 basic_string::swap
[string:: swap]
void swap(basic_string& s);
1 Постусловие: * содержит ту же последовательность символов, которая была в s, s содержит одно и то же последовательность символов, которая была в * этом.
2 Броски: ничего.
3 Сложность: постоянное время.
Следовательно, нужно заключить, что отсутствие noexcept
является надзором.
Другая подсказка приведена в пункте 21.4.6.3 для функции члена assign()
:
basic_string& assign(basic_string&& str) noexcept;
Эффекты: функция заменяет строку, управляемую *this
строкой длиной str.size()
, чья Элементы - это копия строки, управляемой str
. [ Примечание. Действительная реализация - swap(str)
. - end note]
3 Возвраты: *this.
Если swap(str)
предполагается корректной реализацией для assign()
, а assign()
отмечен как безоговорочно noexcept
, тогда имеет смысл предположить, что swap()
будет noexcept
.