Подтвердить что ты не робот

Почему 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.

4b9b3361

Ответ 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.