什么是std::safe_string?

7

我曾提出的一个问题的答案包含以下代码行:

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

意图似乎是将字符串文字包装起来(因此可能不会进行分配)。我从未听说过safe_string,显然google也没有听说过(在98标准中也找不到它)。
有人知道这是关于什么的吗?
4个回答

8

在搜索了Google代码搜索之后(我应该先想到这个...),我找到了这个:

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

NULL转换为空字符串。虽然这不是标准,但可能是特定STL实现中的某种扩展,这在答案中提到了。


6

没有标准的safe_string。你在那个回答中看到的safe_string来自于一个私有的STL扩展实用库。

搜索“stlext/stringext.h”,你会看到同样的库在另一个论坛的帖子中被引用。


您的搜索结果中不包含“safe_string”。 - Motti

4

并不存在名为std::safe_string的东西。


0

这不是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) ;
}

没有额外的开销,也不会崩溃。当我将一个char *字符串传递给std::string时,如果该字符串为空,那么它应该表现为一个空字符串。


使用 "" 创建一个 1 字节的字面对象。如果编译器不够聪明,每个对象都是不同的,因此可能会使代码膨胀。我认为编译器足够聪明,可以优化掉这个问题,因此这是一种虚假的收益,并且会使代码变得复杂。 - Martin York
1
我对返回指向本地对象的指针或引用的想法感到不舒服,即使编译器可能正确处理每个情况(并使“”在返回后仍然存在)。 - paercebal
实际函数返回一个std::string,因此返回指针没有问题,无论如何,字符串字面值存储在程序的数据段中,因此从函数返回字面值的指针是定义良好的。 - Motti
在这种情况下,你是正确的。我的例子是更大的东西的一部分:空字符串在其他地方被重复使用,其他全局常量对象也是如此(我有一个global.hpp和global.cpp源文件用于这些全局常量变量)。 - paercebal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接