C++ std::string\u视图文本是否保证以null结尾?
我知道一个普通的C++ std::string\u视图文本是否保证以null结尾?,c++,string,c++17,standards,string-view,C++,String,C++17,Standards,String View,我知道一个普通的std::string\u视图不能保证以null结尾。但是,我不知道std::string\u视图literal是否保证以null结尾 例如: #include <string_view> using namespace std::literals; int main() { auto my_sv = "hello"sv; } #包括 使用名称空间std::literals; int main() { auto my_sv=“hello”sv; } C
std::string\u视图
不能保证以null结尾。但是,我不知道std::string\u视图
literal是否保证以null结尾
例如:
#include <string_view>
using namespace std::literals;
int main()
{
auto my_sv = "hello"sv;
}
#包括
使用名称空间std::literals;
int main()
{
auto my_sv=“hello”sv;
}
C++17或更高版本是否保证my_sv.data()
以null结尾?
==以下内容已更新===
以下资料均来自:
“hello”sv
,hello
是字符串文字,sv
是后缀李>
“hello”sv
被视为一种形式为操作符“sv(str,len)”的调用代码>根据5.13.5.14,str
以null结尾
sv
的data()
必须返回str
< > > >他们可以证明<代码>“hello”sv.DATA()/Cux>被C++标准的NULL终止吗?< /强>
,所以让我们把简单的部分排除在外。任何
string\u视图
都不会“以NUL结尾”,因为对象表示字符的大小范围。即使从以NUL结尾的字符序列创建string\u视图
,string\u视图
本身仍然不是以NUL结尾的
您真正要问的问题是:实现是否有一些余地使语句“some literal”sv
生成一个字符串视图
,其数据
成员不指向由“some literal”
表示的以NUL结尾的字符串文本?就是这个,
string_view s = "some literal"sv;
允许以任何不同于此的方式行事:
const char *lit = "some literal";
string_view s(lit, <number of chars in of lit>);
返回:字符串视图{str,len}
这是该函数行为的标准规范:它返回一个string\u视图
,该视图指向str
提供的内存。因此,实现不能分配一些隐藏内存并使用这些内存或其他任何内存;返回的string\u view::data
需要返回与str
相同的指针
现在,这给我们带来了一个不同的问题:str
必须是以NUL结尾的字符串吗?也就是说,编译器看到您正在使用sv
UDL实现,因此从它将要为作为str
传递的字符串文本创建的数组中删除NUL字符是否合法
让我们看看:
如果L
是用户定义的字符串文字,则将str
设为不带ud后缀的文字,将len
设为str
中的代码单元数(即,其长度不包括终止的空字符)。文本L
被视为表单的调用
operator "" X(str, len)
注意我强调的短语。我们知道“没有ud后缀的文字”的行为。第二个短语特别提到了str
的预期NUL终止符。我想说,这是一个非常清楚的语句,str
将被赋予一个文本字符串。而且,该字符串将与C++中的正则字符串文字规则相一致,因此将被NUL终止。
鉴于上述情况,我认为可以肯定地说,这里的实施没有回旋余地。UDL返回的string\u视图
必须指向由UDL中指定的字符串文字定义的数组,并且与任何其他字符串文字一样,该数组将以NUL终止
话虽如此,请回顾我的第一段。您不应该编写任何假定
string\u视图
以NUL结尾的代码。即使字符串视图
的创建者和is consumer紧挨在一起,我也会称之为代码气味。在本网站上,使用答案上的绿色复选标记表示“已解决”;没有此类复选标记表示“未解决”。您不应在标题string\u视图
中写入“已解决”等内容。它是一个类。类不是以null结尾的。如果能准确地解释你所问的问题(也许能给出一个string_视图用法的代码示例来演示你所问的情况),那么问题就会得到改进@M.M OP所问的问题不是很清楚吗?你认为添加几行类似的代码会有好处吗?@M.Msv[sv.size()]
是UB,sv.data()[sv.size()]
不一定是UB,但会引起尖叫。我也不清楚OP询问的是哪一个。@M.M所以这个问题可能会被重新表述为“给定auto my_sv=“hello”sv;
,C++17或更高版本是否保证my_sv.data()
以null结尾?”
operator "" X(str, len)