Следующие сбои:
std::map<std::string, int> m1{ {"0", 0}, { "1", 1 }};
// auto melem = m1["0"]; // OK
auto melem = m1[0];
Почему это?
Почему он не должен рухнуть? Аргумент operator[]
должен иметь тип key_type
для данной карты.
Потому что "0"
— один из ключей, а 0
— нет. Почему вы ожидаете, что он не рухнет, или что вы ожидаете вместо этого?
basic_string( const CharT* s,const Allocator& alloc = Allocator() );: Создает строку с содержимым, инициализированным копией строки символов с завершающим нулем, на которую указывает s. Длина строки определяется первым нулевым символом. Поведение не определено, если [s, s + Traits::length(s)) не является допустимым диапазоном (например, если s является нулевым указателем).
@MatthieuBrucher Ответы ниже ура
@mkrieger1 mkrieger1 Честно говоря, логически ожидать «сбоя» для чего-то подобного не следует.
@NathanOliver: я сказал, что ожидал, что это сработает?
@Yksisarvinen: я сказал, что он не должен падать?
@ mkrieger1: я сказал, что он не должен падать?
К сожалению (спасибо C!) «возможно» построить std::string
из целого числа 0
, потому что оно считается литерал нулевого указателя.
Однако это невозможно В самом деле:
Constructs the string with the contents initialized with a copy of the null-terminated character string pointed to by
s
. The length of the string is determined by the first null character. The behavior is undefined if[s, s + Traits::length(s))
is not a valid range (for example, ifs
is a null pointer).
У вас произошел сбой, потому что вы пытались создать std::string
из нулевого указателя.
Как минимум с GCC результат этого нарушения контракта является [необработанным] исключением с описательным именем:
terminate called after throwing an instance of 'std::logic_error'
what(): basic_string::_M_construct null not valid
К сожалению, вы не можете полагаться на это, и вы не получаете никаких предупреждений во время сборки. ?
Спасибо, это действительно помогает. Действительно, никакого предупреждения, просто крах. Я думал, что это как-то связано с картой, но на самом деле это не так. сделать что-то вроде std::string s = 0 достаточно, чтобы программа вылетела. Спасибо!
@Korchkidu Правильно :)
0
это не строка. Почему вы ожидаете, что это сработает?