作为一种默契的理解,我一直认为
背景:至少Visual C++和gcc附带的实现没有这个特性。请考虑以下示例(在此处查看实时示例):
std::string
的每个实现必须满足对于每个字符串str
都有strlen(str.c_str()) == str.length()
。
C++标准对此有何规定?(有吗?)背景:至少Visual C++和gcc附带的实现没有这个特性。请考虑以下示例(在此处查看实时示例):
// Output:
// string says its length is: 13
// strlen says: 5
#include <iostream>
#include <cstring>
#include <string>
int main() {
std::string str = "Hello, world!";
str[5] = 0;
std::cout << "string says its length is: " << str.length() << std::endl;
std::cout << "strlen says: " << strlen(str.c_str()) << std::endl;
return 0;
}
当然,没有通知str
的写操作会导致“问题”。但这不是我的问题。我想知道标准对这种行为有何规定。
std::string
支持空字符(NUL 字符),而 C 字符串不支持。 - chrischar *
中嵌入NULs。例如,BSTR
包含一个长度前缀,后跟数据,后跟两个NUL(其中的字符为wchar_t
,但相同的想法适用)。 - chrisstd::string::length()
不会每次调用strlen()
,它只是返回存储的长度。在字符串中插入一个nul字节不会改变存储的长度。 - Jonathan Wakely