Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++11 尽管字符串具有以null结尾的字符,但std::string的长度是否一致?_C++11 - Fatal编程技术网

C++11 尽管字符串具有以null结尾的字符,但std::string的长度是否一致?

C++11 尽管字符串具有以null结尾的字符,但std::string的长度是否一致?,c++11,C++11,我的问题来自于阅读libstdc++的basic_string.h中函数length()和size()的注释,该注释随Ubuntu 14.04发布: 评论指出如下: 返回字符串中的字符数,不包括任何空终止 在字符串仅包含空终止字符的情况下,我的这一评论令人困惑,特别是考虑到strlen的传统工作方式时,我担心编译器可能会以一种不返回size()而返回由char_traits::length()确定的长度的方式实现字符串 虽然很明显,字符串长度是已知的,不需要null终止字符,但传统字符串的长度概

我的问题来自于阅读libstdc++的basic_string.h中函数length()和size()的注释,该注释随Ubuntu 14.04发布:

评论指出如下:

返回字符串中的字符数,不包括任何空终止

在字符串仅包含空终止字符的情况下,我的这一评论令人困惑,特别是考虑到strlen的传统工作方式时,我担心编译器可能会以一种不返回size()而返回由char_traits::length()确定的长度的方式实现字符串

虽然很明显,字符串长度是已知的,不需要null终止字符,但传统字符串的长度概念与容器的长度概念不同。我担心这可能在某个时候发生了变化,我想知道下面这样的代码会有什么风险

std::string header(4, char{});
assert(header.length() == 4);
。。。不完全是跨平台的

我假设它(问题)必须成立,我的假设是:

其中字符串仅包含空终止字符

这些不是“以null结尾的字符”,因为它们不终止字符串,它们是字符串的一部分。它们是空字符,但不是以空结尾的

您看到的行为由标准保证。您告诉
字符串
创建一个由四个空字符组成的字符串,这就是您得到的结果

在编译器之间或标准修订版之间不可移植将是一件荒谬的事情。这总是有保证的

我的问题也出现了,因为这与斯特伦的传统行为不一致,而char_traits::length()

这无关紧要,因为
char*
不知道它的长度。一个
std::string


<>我将改变LISSTDC + +标题中的注释,使你混淆,使其更清楚。< / P>是的,它按照标准进行。可能是我认为它完全不相关的DUP,尽管我没有读过更老的标准(例如C++ 98)的详细细节。我可以想象,较旧的标准或编译器可能是为了一致性而这样做的。不难想象(可能是错误的)传统意义上使用的长度(直到null终止符),容器意义上使用的size()。顺便说一句,恕我直言——为什么要贬低我?因为缺乏研究而被否决。在标准修订版之间更改
std::string::length()
的含义也很愚蠢。我已经看过了现有的标准。我的问题涉及历史因素所涉及的风险。实际上,我的问题来自于查看glibcpp源代码,看到代码没有按照注释中的说明执行…,注释中提到了空终止,这是不相关的。我已经做了研究…标准和lib评论不匹配,我想知道应该相信哪一个,在哪里/何时出现差异什么是glibcpp?你在说什么?什么差异?你知道cppreference.com不是标准,对吧?但是,如果不同标准的行为不同,那么cppreference.com会提到这一点。