Является ли по умолчанию конструктор std::string no-throw?
Может std::string s; бросить при каких обстоятельствах? Регулируется ли это стандартом (интересует C++03, если есть различия)?
3 ответа
Это было изменено WG21 / N4002. Первый рабочий документ содержит документ WG21 / N4296:
// 21.4.2, construct/copy/destroy:
basic_string() noexcept : basic_string(Allocator()) { }
В C++11 конструктор по умолчанию фактически принимает один (по умолчанию) аргумент, а именно allocator (21.4.2):
explicit basic_string(const Allocator& a = Allocator());
Этот конструктор не объявлен как noexcept
, (Я полагаю, что для этого потребуется, чтобы у распределителя был конструктор копирования без выброса.) Как указывают Джонатан и Бо, конструктор копирования распределителя не должен вызывать никаких исключений, но конструктору строки разрешается выполнять операции выброса (например, выделять начальный объект). часть памяти). Конечно, должно быть возможно написать строковый класс, который как не-бросающий, constexpr
конструктор, но стандартная строка библиотеки не указана, чтобы быть такой.
Конечно, если распределение по какой-либо причине невозможно