是否可以包含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- 一个正值。
第一个要点很简单,如果每个字符都相等,则它给出零。
第二个有点难,但它基本上给出一个负值,其中字符之间的第一个差异使第一个字符串位于下侧(所有先前的字符都相等,并且有问题的字符在第一个字符串中较低)。
第三个只是默认值“如果既不等于也不小于,则必须更大”。
nul-character是比较的一部分,请参见https://en.cppreference.com/w/cpp/string/basic_string/operator_cmp
如果 lhs 和 rhs 的大小相等并且 lhs 中的每个字符在 rhs 中的相同位置具有相同的字符,则两个字符串相等。