LINUX.ORG.RU

Почему конструктор std::string принимает const char*

 


0

1

Добрый день, зачем ctor std::string хочет на вход именно указатель на символьную константу, а не просто указатель на строку символов. Там проводятся оптимизации какие-нибудь? И если да, то какие?


Намек на то что конструктор не будет изменять входную строку, только прочитает ее

vertexua ★★★★★
()

указатель на символьную константу - это строка и есть (указатель на начало её), в классическом C-шном смысле, в частности выражения "foobar" такие производят

dumdum
()
Последнее исправление: dumdum (всего исправлений: 1)
char c_str[] = "123";
std::string str{c_str};

Обычный char* также принимается.

anonymous
()

хочет на вход именно указатель на символьную константу, а не просто указатель на строку символов.

Очень интересно.

Конструктор std::string принимает const char*. const char* это указатель на константный char, в данном случае интерпретирующийся как первый байт «строки». Напоминаю, что в С строк нет.

const там говорит не о том, что это «символьная константа» (что бы это ни значило), а о том, что std::string не будет изменять переданную строку, а просто скопирует себе ее содержимое.

Siborgium ★★★★★
()
Ответ на: комментарий от Siborgium

Вот это я и хотел уточнить, std::string хочет что бы ему пришла строка которую никто не будет изменять, что бы просто создать указатель на нее без всяких malloc. Т.е. будет ли разница в реализации хранения символьного массива в зависимости от того передаем мы const char* или просто char*

da17
() автор топика
Последнее исправление: da17 (всего исправлений: 1)
Ответ на: комментарий от da17

Вот это я и хотел уточнить, std::string хочет что бы ему пришла строка которую никто не будет изменять, что бы просто создать указатель на нее без всяких malloc.

Нет и нет. const char* может изменяться, и string всегда копирует себе строку. const char* говорит только что сам конструктор string не будет изменять данные по этому указателю.

Т.е. будет ли разница в реализации хранения символьного массива в зависимости от того передаем мы const char* или просто char*

Нет.

slovazap ★★★★★
()
Последнее исправление: slovazap (всего исправлений: 2)
Ответ на: комментарий от da17

std::string хочет что бы ему пришла строка которую никто не будет изменять, что бы просто создать указатель на нее без всяких malloc

Нет. Не «никто не будет изменять», а которую std::string обещает не изменять.

Т.е. будет ли разница в реализации хранения символьного массива в зависимости от того передаем мы const char* или просто char*

Нет. Передаваемый char* будет приводиться к const char*.

Siborgium ★★★★★
()
Ответ на: комментарий от da17

std::string хочет что бы ему пришла строка которую никто не будет изменять

Не никто, а сам std::string не будет изменять переданную строку. Повтори главу про const ссылки и указатели.

чтобы просто создать указатель на нее без всяких malloc

std::string всегда создаёт копую переданной строки, и std::string владеет этой копией. Используется ли для этого аллокатор (не malloc) или нет, зависит от оптимизаций.

rupert ★★★★★
()

Потому что строка владеет своим буфером, и это буфер может быть пересоздан заново, чтобы расшириться. Поэтому проще не усложнять.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.