ответ на один из моих вопросов включает следующую строку кода:
label = std::safe_string(name); // label is a std::string
Намерение похоже на оболочку вокруг строкового литерала (поэтому, по-видимому, не происходит выделения). Я никогда не слышал о safe_string и, судя по всему, не имеет Google (и не смог найти его в стандарте 98).
Кто-нибудь знает о чем это?





std::safe_string не существует
Стандартной safe_string не существует. Строка safe_string, которую вы видите в ответе ответчика, выглядит как частная библиотека служебных программ расширений STL.
Google по запросу "stlext / stringext.h", и вы увидите ссылку на ту же библиотеку в сообщении на другом форуме.
После поиска поиск кода 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, но в этом конкретном случае должна вести себя как пустая строка.
Использование "" создает однобайтовый буквальный объект. Если компилятор не умен, каждый из них отличается и, следовательно, потенциально может раздувать код. Я подозреваю, что компилятор достаточно умен, чтобы оптимизировать это, и, таким образом, это ложный выигрыш и усложняет код.
Мне не нравится идея возврата указателей или ссылок на локальные объекты, даже если предполагается, что компилятор правильно обрабатывает каждый случай (и заставляет "" пережить возврат).
Функция actall возвращает std :: string, поэтому нет проблем с возвратом указателя, в любом случае строковые литералы хранятся в сегменте данных программы, поэтому вполне определено возвращать указатель на литерал из функции.
В этом случае ты прав. Мой пример был частью чего-то большего: пустая строка была повторно использована в другом месте, как и другие глобальные постоянные объекты (у меня есть источники global.hpp и global.cpp для таких глобальных переменных-констант).
Результаты вашего поиска не включают "safe_string".