Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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++ std::string\u视图文本是否保证以null结尾?_C++_String_C++17_Standards_String View - Fatal编程技术网

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结尾?

==以下内容已更新===

以下资料均来自:

  • 根据5.13.5.14,字符串文字以null结尾
  • 根据5.13.8,用户定义的字符串文字由字符串文字和自定义后缀组成。比如说,
    “hello”sv
    hello
    是字符串文字,
    sv
    是后缀
  • 根据5.13.8.5,
    “hello”sv
    被视为一种形式为
    操作符“sv(str,len)”的调用根据5.13.5.14,
    str
    以null结尾
  • 根据21.4.2.1,
    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.M
    sv[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)