我的问题来自于读取libstdc ++的basic_string.h中的函数length()和size()的注释,该注释随Ubuntu 14.04一起发布:
评论声明如下:
返回字符串中的字符数,不包括任何空终止。
这个评论对于字符串只包含空终止字符的情况很困惑,特别是考虑strlen传统上如何工作时,我担心编译器可能会以不返回大小的方式实现字符串()但是由char_traits :: length()确定的长度。
虽然可以明显知道字符串长度而不需要空终止字符,但传统字符串长度的概念与容器的长度概念不同。我担心这可能会在某些时候发生变化,我想知道代码风险如下面的代码......
std::string header(4, char{});
assert(header.length() == 4);
......并非完全跨平台。
我假设它(问题)必须保持有效,我的假设来自reference:
答案 0 :(得分:3)
其中字符串仅包含空终止字符
那些不是“空终止字符”,因为它们终止字符串,它们是它的一部分。它们是空字符,但不是空终止。
您看到的行为由标准保证。你告诉string
创建一个由四个空字符组成的字符串,这就是你得到的结果。
在编译器之间或标准版本之间不可移植将是一件荒谬的事情。它始终得到保证。
我的问题也出现了,因为这与strlen的传统行为不一致,而char_traits :: length()
这是无关紧要的,因为char*
不知道它的长度。 std::string
可以。
我将更改libstdc ++标题中的注释,使您更加清楚。