Что такое std :: safe_string?

ответ на один из моих вопросов включает следующую строку кода:

label = std::safe_string(name); // label is a std::string

Намерение похоже на оболочку вокруг строкового литерала (поэтому, по-видимому, не происходит выделения). Я никогда не слышал о safe_string и, судя по всему, не имеет Google (и не смог найти его в стандарте 98).

Кто-нибудь знает о чем это?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
7
0
697
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

std::safe_string не существует

Стандартной safe_string не существует. Строка safe_string, которую вы видите в ответе ответчика, выглядит как частная библиотека служебных программ расширений STL.

Google по запросу "stlext / stringext.h", и вы увидите ссылку на ту же библиотеку в сообщении на другом форуме.

Результаты вашего поиска не включают "safe_string".

Motti 26.10.2008 22:21
Ответ принят как подходящий

После поиска поиск кода Google (я должен был сначала подумать об этом ...) я нашел это:

//tools-cgi.cpp
string safe_string (const char * s)
{
    return (s != NULL) ? s : "";
}

Что преобразует NULL в строки нулевой длины. Хотя это не стандартно, это, вероятно, какое-то расширение в конкретной реализации STL, о которой говорилось в ответе.

Это не является частью стандарта C++ (но, может быть, так и должно быть?)

Я использовал такую ​​же вспомогательную функцию, чтобы избежать исключения std :: string со строкой NULL char *. Но это было больше похоже на:

// defined somewhere else as ""
extern const char * const g_strEmptyString ;

inline const char * safe_string(const char * p)
{
   return (p) ? (p) : (g_strEmptyString) ;
}

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

Использование "" создает однобайтовый буквальный объект. Если компилятор не умен, каждый из них отличается и, следовательно, потенциально может раздувать код. Я подозреваю, что компилятор достаточно умен, чтобы оптимизировать это, и, таким образом, это ложный выигрыш и усложняет код.

Martin York 26.10.2008 18:13

Мне не нравится идея возврата указателей или ссылок на локальные объекты, даже если предполагается, что компилятор правильно обрабатывает каждый случай (и заставляет "" пережить возврат).

paercebal 26.10.2008 20:42

Функция actall возвращает std :: string, поэтому нет проблем с возвратом указателя, в любом случае строковые литералы хранятся в сегменте данных программы, поэтому вполне определено возвращать указатель на литерал из функции.

Motti 26.10.2008 22:23

В этом случае ты прав. Мой пример был частью чего-то большего: пустая строка была повторно использована в другом месте, как и другие глобальные постоянные объекты (у меня есть источники global.hpp и global.cpp для таких глобальных переменных-констант).

paercebal 27.10.2008 14:20

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