【发布时间】:2014-01-05 19:24:42
【问题描述】:
(周日晚上思考)
在我编写的函数中,我倾向于同时依赖 const char* 和同一字符串的模板内联 const std::basic_string<>& 变体。但我真的很好奇为什么空字符串的c_str() 不是nullptr。
大多数 C++ 编码人员现在将 const char* 指针视为 C 代码,但我认为它非常 C++,因为字符串是 null 终止和连续的,并将继续以这种方式。但是如果您使用自定义分配器,那么您使用const std::string& 参数编写的所有代码都是毫无意义的(除非只有标题)。
因此,您真正的选择(如果您想多才多艺) 是老式字符指针或内联模板函数,它们可以支持各种 std::basic_string 和自定义分配器或特征。这会迫使您内联模板化函数,因为您无法预先正确预测模板参数。
现在我的问题是:为什么空字符串不为 c_str() 返回 nullptr? 作为字符串函数中的最低公分母,尤其是对于只读访问是const char* 而不是const std::string&,它是模板化的,因此受到限制。返回指向任何东西的指针,尤其是在没有进行字符串分配的情况下……在我看来很奇怪。
还是我太疯狂了以至于不能这样做?总是担心const char* 和模板化的const std::basic_string<char, ..., ...>& 对应物。如果std::string().c_str() where nullptr,我不会担心。但我必须自己防范空字符串,因为c_str() 在std::basic_strings 上不可靠。
PS:我知道旧式字符串函数在与空指针一起使用时会崩溃,但在任何地方使用字符串之前,可以轻松测试有效指针和非空第一个字符.
PPS:我在这里谈论的是健全的以 null 结尾的字符串,而不是 std::basic_string 特别支持的包含 null 的伪字符串。
问题改写:为什么std::string().c_str() 不应该指向内存?应该是nullptr。与 std::string().c_str("") 不同,后者是一个空字符串,需要一个 \0 尾随它。所以它实际上指向有效内存。 (如果您不了解字符串/指针的工作原理,请不要费心回答。这需要一些类似 C 的理解。)
【问题讨论】:
-
空字符串是没有元素的字符串。空指针不是字符串。
-
反对者请解释一下。
-
@Praetorian:这听起来更像是对 OP 问题的回答,而不是投反对票的理由。
-
@Benjamin :) 当我输入评论时似乎不是这样。无论如何,下面的答案更能说明为什么
c_str()返回nullptr以指示空字符串是完全错误的。 -
"但是如果您使用自定义分配器,那么您使用 const std::string& 参数编写的所有代码都是毫无意义的(除非只有标头)。"这是string_view 的主要动机之一,以提供更好的
const string&,它独立于内存分配细节。