Можно
std :: string s;
бросить при каких обстоятельствах? Регулируется ли это стандартом (интересует C ++ 03, если есть различия)?
Это было изменено 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
конструктор, но стандартная строка библиотеки не указана, чтобы быть такой.
Конечно, если распределение по какой-либо причине невозможно