字符串或字符串视图的比较是否以空字符终止?

Bon*_*ero 1 c++ c++17

是否可以包含astring或字符,以便以下代码打印 1 两次?string_view'\0'

或者这只是实现定义的?

#include <iostream>
#include <string_view>
#include <string>

using namespace std;

int main()
{
    string_view sv( "\0hello world", 12 );
    cout << (sv == sv) << endl;
    string str( sv );
    cout << (str == sv) << endl;
}
Run Code Online (Sandbox Code Playgroud)

这与字符串是否可以嵌入空值的问题并不重复,因为它们显然可以我想问的是字符串或字符串视图的比较是否以 0 字符终止。

pax*_*blo 12

语言律师回答,因为根据定义,标准文件是唯一的真相来源:-)

标准对此有明确规定。在 C++17 中(因为这是您提供的标签,但后来的迭代是类似的),[string.operator==]声明,对于使用字符串和/或字符串视图,它:

Returns: lhs.compare(rhs) == 0.

[string.compare]节进一步指出,这些都归结为与字符串视图的比较,并解释说:

rlen将要比较的字符串的有效长度确定为size()和中的较小者sv.size()。然后该函数通过调用 来比较两个字符串traits::compare(data(), sv.data(), rlen)

这些大小不受嵌入空值的任何限制。

而且,如果您查看 的表 54 中的特征信息[char.traits.require],您会发现它像泥一样清晰,直到您将其分成几个部分:

X::compare(p,q,n)返回int

  • 0如果对于每个iin [0,n)X::eq(p[i],q[i])true;别的
  • j如果对于某些in为 true 并且对于每个in为true [0,n),则为负值;别的X::lt(p[j],q[j])i[0,j) X::eq(p[i],q[i])true
  • 一个正值。

第一个要点很简单,如果每个字符都相等,则它给出零。

第二个有点难,但它基本上给出一个负值,其中字符之间的第一个差异使第一个字符串位于下侧(所有先前的字符都相等,并且有问题的字符在第一个字符串中较低)。

第三个只是默认值“如果既不等于也不小于,则必须更大”。


Jar*_*d42 9

nul-character是比较的一部分,请参见https://en.cppreference.com/w/cpp/string/basic_string/operator_cmp

如果 lhs 和 rhs 的大小相等并且 lhs 中的每个字符在 rhs 中的相同位置具有相同的字符,则两个字符串相等。

  • 已删除问题中的代码不能包含空字符。 (2认同)