какое преобразование типов происходит, когда логическое значение используется для создания строкового объекта? - PullRequest
5 голосов
/ 26 января 2011

В моем коде произошла опечатка: вместо использования "false" при инициализации объекта std::string я набрал false (то есть bool).Теперь это не сообщало ни об одной ошибке компиляции.Но позже в моем коде, когда этот строковый объект используется, я получаю std::logic_error во время выполнения.Может кто-нибудь объяснить, почему в этом случае была разрешена конструкция (иначе я получил бы ошибку компиляции и нашел бы проблему там)?

Вот небольшой фрагмент -

#include <iostream>

int main ()
{

   std::string str = false;

   std::cout << str << "\n";

}

О / р, который я получаю при запуске этого -

xhdrdevl8@~/MYBACKUP=>g++ -o test_string -g test_string.cxx

xhdrdevl8@~/MYBACKUP=>./test_string

terminate called after throwing an instance of 'std::logic_error'
  what():  basic_string::_S_construct NULL not valid
Aborted

1 Ответ

8 голосов
/ 26 января 2011

std::string имеет конструктор, который принимает const char* в строку с нулевым символом в конце.

false можно использовать в качестве константы нулевого указателя, поскольку это целочисленное выражение константы со значением ноль, поэтому используется этот конструктор std::string.

Передача нулевого указателяэтому конструктору дает неопределенное поведение.Ваша реализация Стандартной библиотеки помогает вам, генерируя исключение logic_error, чтобы сообщить вам, что вы нарушили ограничения конструктора std::string, передав ему нулевой указатель.Другие реализации могут быть не очень полезны (вы можете получить немедленный сбой или повреждение данных или кто что знает).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...