为什么empty()std :: basic_string c_str()不是nullptr?

Cod*_*gry -2 c++ string stl std c++11

(在周日晚上思考)

在我编写的函数中,我倾向于依赖于相同字符串的两个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()在哪里nullptr,我不担心.但我必须自己防范空弦,因为c_str()它不可靠std::basic_string.

PS:我知道旧的字符串函数在与空指针一起使用时会崩溃,但是在任何地方使用字符串之前,可以轻松地测试有效指针和非空的第一个字符.

PPS:我在这里谈论理智的以空字符结尾的字符串,而不是std::basic_string特别支持的包含空值的伪字符串.

问题重复:为什么不std::string().c_str()应该指向内存?它应该是nullptr.不像std::string().c_str("")是一个空字符串,需要\0尾随它.所以它实际上指向有效的内存.(如果您不理解字符串/指针是如何工作的,请不要费心回答.这需要一些类似C的理解.)

zak*_*ter 6

默认的构造函数的std::string将构建一个空字符串.

如果std::string没有相应的有效C字符串,则无法构造对象.std::string()相当于std::string("")因此std::string::c_str()总是会返回一个有效的指针,应该永远不会返回一个空指针.


Joh*_*han 5

在以下表达式中:

const char* foo = "";
Run Code Online (Sandbox Code Playgroud)

有一个空字符串,但我没有看到空指针.空C字符串是char []用char[0] = '\0',这就是全部.

带有const char*类型的空指针是不存在的字符串.