Std::map<string, int> вылетает при выполнении m[0]

Следующие сбои:

  std::map<std::string, int> m1{ {"0", 0}, { "1", 1 }};
  // auto melem = m1["0"]; // OK
  auto melem = m1[0];

Почему это?

0 это не строка. Почему вы ожидаете, что это сработает?
NathanOliver 30.05.2019 18:30

Почему он не должен рухнуть? Аргумент operator[] должен иметь тип key_type для данной карты.

Yksisarvinen 30.05.2019 18:30

Потому что "0" — один из ключей, а 0 — нет. Почему вы ожидаете, что он не рухнет, или что вы ожидаете вместо этого?

mkrieger1 30.05.2019 18:32

basic_string( const CharT* s,const Allocator& alloc = Allocator() );: Создает строку с содержимым, инициализированным копией строки символов с завершающим нулем, на которую указывает s. Длина строки определяется первым нулевым символом. Поведение не определено, если [s, s + Traits::length(s)) не является допустимым диапазоном (например, если s является нулевым указателем).

Matthieu Brucher 30.05.2019 18:39

@MatthieuBrucher Ответы ниже ура

Lightness Races in Orbit 30.05.2019 18:43

@mkrieger1 mkrieger1 Честно говоря, логически ожидать «сбоя» для чего-то подобного не следует.

Lightness Races in Orbit 30.05.2019 18:44

@NathanOliver: я сказал, что ожидал, что это сработает?

Korchkidu 30.05.2019 21:35

@Yksisarvinen: я сказал, что он не должен падать?

Korchkidu 30.05.2019 21:35

@ mkrieger1: я сказал, что он не должен падать?

Korchkidu 30.05.2019 21:35
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
6
9
162
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

К сожалению (спасибо 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, if s 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 30.05.2019 21:41

@Korchkidu Правильно :)

Lightness Races in Orbit 31.05.2019 12:17

Другие вопросы по теме