std::string_view 文字是否保证以 null 终止?

2024-01-09

我知道一件微不足道的事std::string_view不保证以空终止。然而,我不知道是否std::string_view文字保证以空终止。

例如:

#include <string_view>

using namespace std::literals;

int main()
{
    auto my_sv = "hello"sv;
}

C++17 或更高版本是否保证my_sv.data()是 null 终止的吗?

===以下已更新===

以下全部来自n4820 https://github.com/cplusplus/draft/raw/master/papers/n4820.pdf:

  1. 根据 5.13.5.14,字符串文字以 null 结尾。
  2. 根据 5.13.8,用户定义的字符串文字由字符串文字加上自定义后缀组成。说,"hello"sv, hello是字符串文字,sv是后缀。
  3. 根据 5.13.8.5,"hello"sv被视为以下形式的调用operator "" sv(str, len);根据 5.13.5.14,str是 空终止。
  4. 根据 21.4.2.1,sv's data()必须返回str.

他们能证明吗"hello"sv.data()C++ 标准保证以 null 终止吗?


因此,让我们把简单的部分排除掉。不string_view永远是“NUL 终止”,因为该对象代表一定大小的字符范围。即使您创建了一个string_view从 NUL 终止的字符序列中,string_view itself仍然不是“NULL 终止”。

您真正要问的问题是:实现是否有一些余地来发表声明"some literal"sv产量astring_view whose data member does not指向由 NUL 结尾的字符串文字"some literal"?也就是说,是这样的:

string_view s = "some literal"sv;

允许行为any way与此不同:

const char *lit = "some literal";
string_view s(lit, <number of chars in of lit>);

在后一种情况下,s.data()保证是指向字符串文字的指针,因此您可以将该指针视为指向以 NUL 结尾的字符串的指针。您问的是前者是否同样有效。

我们来调查一下。这的定义operator""sv过载被规定为 https://timsong-cpp.github.io/cppwp/n4659/string.view.literals:

constexpr string_view operator""sv(const char* str, size_t len) noexcept;

返回:string_­view{str, len}.

这是该函数行为的标准规范:它返回一个string_view它指向由提供的内存str。因此,实现不能分配一些隐藏内存并使用它或其他什么;返回的string_view::data 是必须的返回相同的指针str.

现在,这给我们带来了一个不同的问题:是str required是一个以 NUL 结尾的字符串?也就是说,编译器看到您正在使用svUDL 实现,因此从它将为传递的字符串文字创建的数组中删除 NUL 字符str?

让我们看看字符串的 UDL 如何工作 https://timsong-cpp.github.io/cppwp/n4659/lex.ext#5:

If L是一个用户定义的字符串文字,让str be the 不带 ud 后缀的文字然后让len是代码单元的数量str(即它的长度排除终止空字符)。字面意思L被视为以下形式的调用

operator "" X(str, len)

请注意我强调的短语。我们知道“没有 ud 后缀的文字”的行为。第二个短语特别提到了预期的 NUL 终止符str。我想说这是一个非常明确的声明str将给出一个文字字符串。该文字字符串将按照 C++ 中的常规字符串文字规则构建,因此将以 NUL 结尾。

鉴于上述情况,我认为可以肯定地说,这里的实施没有回旋余地。这string_view由 UDL 返回must指向由 UDL 中指定的字符串文字定义的数组,并且与任何其他字符串文字一样,该数组will以 NULL 终止。

话虽如此,please回顾我的第一段。您不应该编写任何假设的代码string_view以 NUL 结尾。我会把它称为代码味道,即使它的创建者string_view并且消费者彼此相邻。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

std::string_view 文字是否保证以 null 终止? 的相关文章

  • 将 ARGB 拆分为字节值

    我有一个 ARGB 值存储为 int 类型 它是通过调用 ToArgb 来存储的 我现在想要来自 int 值的各个颜色通道的字节值 例如 int mycolor 16744448 byte r g b a GetBytesFromColor
  • 命名管道客户端无法连接到作为网络服务运行的服务器

    我有一个服务在网络服务帐户下运行 该服务只是设置一个命名管道并侦听连接 NamedPipeServerStream listeningPipe new NamedPipeServerStream ourservicepipe PipeDir
  • 等待运算符错误

    我的代码有问题 我怎么解决这个问题 这个问题出现在await操作符中 public MyModel HttpClient client new HttpClient HttpResponseMessage response await cl
  • Monitor.Pulse & Wait - 意外行为

    http www codeproject com Articles 28785 Thread synchronization Wait and Pulse demystified http www codeproject com Artic
  • 为什么 fgets 接受 int 而不是 size_t?

    功能如strcpy malloc strlen 和其他各种接受他们的参数或返回值作为size t代替int or an unsigned int出于显而易见的原因 一些文件功能 例如fread and fwrite use size t以及
  • C 中的 '\0' 和 printf()

    在 C 入门课程中 我了解到在存储字符串时存储空字符 0在它的最后 但是如果我想打印一个字符串怎么办 printf hello 虽然我发现它并没有结束 0通过以下声明 printf d printf hello Output 5 但这似乎不
  • C++ 并行任务的开销

    我有以下简单的功能 include
  • C 链表销毁函数

    我正在尝试学习 C 和很多人一样 我对指针有点困惑 无论如何 我创建了一个递归函数来销毁我的链表 但是正如我调试的那样 当我从函数返回时 列表的头部不应该为空 所以我猜这是对指针的一些基本误解 这是函数 void destroy struc
  • 微软怎么能说WinAPI中一个字的大小是16位呢?

    我刚刚开始学习WinAPI 在MSDN中 对WORD数据类型提供了以下解释 WORD16 位无符号整数 范围是十进制 0 到 65535 该类型在 WinDef h 中声明如下 typedef 无符号短 WORD 很简单 而且它与我一直在使
  • FFplay成功移入我的Winform中,如何设置它无边框?

    用这个代码 在 C 应用程序中显示 tcp 视频流 来自 FFPLAY FFMPEG https stackoverflow com questions 14201894 show a tcp video stream from ffpla
  • 使用 FromBase64Transform 解码 base64 文件流

    The example https msdn microsoft com en us library system security cryptography frombase64transform 28v vs 110 29 aspx从M
  • 如何解析多态 JSON 数组?

    我有一个 JSON 格式的文件 其中包含个人用户的记录 一些用户的记录中间有一个评论字段 我只想解析顶级项目 全名 贡献者姓名 电子邮件 使用 Newtonsoft JSON 解析器 但我似乎无法让它识别单个对象 当我将整个字符串解析为一个
  • 使用信号和槽更新指针

    我对 Qt 很陌生 请帮我解决这个问题 我正在使用线程在后台执行密集操作 同时我想更新 UI 所以我使用 SIGNALS 和 SLOTS 为了更新 UI 我发出一个信号并更新 UI 让我们考虑下面的示例代码 struct sample QS
  • 如何将 Boost Spirit 自动规则与 AST 结合使用?

    编辑 当我想在另一个规则上使用它时 我扩展了 sehe 的示例以显示问题 http liveworkspace org code 22lxL7 http liveworkspace org code 22lxL7 17 我正在尝试提高 Bo
  • 当一对迭代器初始化时,向量是否知道先保留?

    考虑以下代码 struct MyData MyData const BYTE pData size t uSize bucket pData pData uSize std vector
  • 我的代码哪里有泄漏?

    下面是我的代码 它打开一个 XML 文件 old xml 过滤无效字符并写入另一个 XML 文件 abc xml 最后 我将再次加载 XML abc xml 当执行以下行时 出现异常 表示 xml 文件被另一个进程使用 xDoc Load
  • 使用 DataGridViewCheckboxCell 真正禁用 DataGridView 中的复选框

    有谁知道如何使用 DataGridViewCheckboxCell 禁用 DataGridView 中的复选框 我可以将其设置为只读 并设置背景颜色 但我无法让复选框本身显示为禁用状态 有什么想法吗 Guess 你必须自己画 http so
  • 如何从 C# 中的 Web Api 方法正确获取字节数组?

    我有以下控制器方法 HttpPost Route SomeRoute public byte MyMethod FromBody string ID byte mybytearray db getmybytearray ID working
  • 小数精度

    我使用小数类型进行高精度计算 货币 但我今天遇到了这个简单的划分 1 1 37 这应该再次得到 37 http www wolframalpha com input i 1 2F 281 2F37 29 http www wolframal
  • 从 C/C++ 程序进行 Ping

    我想编写一个 C 或 C 程序 给定一个 IP 地址 对其进行 Ping 然后根据 Ping 是否成功执行进一步的操作 这个怎么做 尽情享受Ping 页面 http www ping127001 com pingpage htm 其中有一个

随机推荐

  • 如何在更新面板刷新后执行 JavaScript(无法让 Sys.WebForms.PageRequestManager.getInstance().add_endRequest(); 工作)

    我试图在更新面板刷新后运行 JavaScript 我读过一些地方 您可以使用与此类似的代码 function codeToRun Code Here Sys WebForms PageRequestManager getInstance a
  • WordPress 挂钩/过滤器来处理帖子内的链接

    有没有挂钩 过滤器来处理添加到 WordPress 帖子中的链接 我的目标是预处理链接使用以下按钮插入帖子中并使用第三方 API 如 bit ly 缩短它 我想对内部 外部链接执行此操作 我想到的一个解决方案是向我的编辑器添加一个额外的按钮
  • 如何在 SwiftUI 中正确制作可调整的分割视图?

    这是我第一次尝试 SwiftUI 我正在尝试创建一个充当分割视图的 SwiftUI 视图 并在两个视图的中心有一个可调节手柄 这是我当前的代码实现示例 struct ContentView View State private var ge
  • 为 ASP.NET Core 中的选项自定义 JSON 属性名称

    从 JSON 文件加载配置时 我想使用不同的属性名称进行配置 public class MinioConfiguration DataMember Name MINIO ENDPOINT public string Endpoint get
  • Rails 控制台可以重新加载 lib 下的模块吗?

    我的 Rails 项目中的 lib 下有一个模块 我运行 rails c 并在控制台中进行一些实验 我对 lib 下的模块进行了更改 输入 reload 从控制台 它不会重新加载文件 我必须退出控制台并重新启动 这真的很痛苦 有没有更好的方
  • NestJS中的TypeORM无法连接到MongoDB

    我在自己的Ubuntu服务器上安装mongodb软件 我得到的mongo字符串就像这样mongodb xxx email protected cdn cgi l email protection 27017 当我在本地终端中输入此字符串并使
  • 使用内联插件运行 Grails 3 项目

    我几乎可以肯定这是一个愚蠢的问题 但我不知道答案 我正在将我的项目从 Grails 2 5 升级到 3 并尝试掌握新的内联插件结构 旧的方式运行良好 但很难让新的方式运行 我的目录结构如下 settings gradle myApp con
  • 确定 WPF 弹出窗口使用哪个 CustomPopupPlacement

    我试图找出传入的数组中的哪一个CustomPopupPlacement弹出窗口实际渲染时已使用位置 有什么事件可以检测到这一点吗 2009 年的 msdn 线程似乎正是我的问题 但似乎没有答案 http social msdn micros
  • 在AWS中重新分配私有IP地址?

    我有一个在弹性 IP 后面运行的 AWS 实例 该实例在我的 VPC 中还有一个私有 IP 地址 我将把弹性 IP 重新分配给另一个实例 并尝试重新分配私有 IP 请注意 该实例只有一个私有 IP 无辅助 IP 这可能吗 除非这是 辅助私有
  • Java接口抛出异常但接口实现不抛出异常?

    我读到这段代码 其中接口抛出异常 但实现它的类不会抛出或捕获异常 这是为什么 java中它合法还是安全 import java rmi public interface MyRemote extends Remote public Stri
  • 如何将字符串转换为数学函数一次?

    我想构建类似于 desmos 的东西 您可以在画布中绘制图形 然后移动它 到目前为止我已经成功了 但唯一剩下的就是用户输入 Using a
  • jsondoc-ui.html 未加载,错误 404

    我没有应该加载jsondoc ui html 错误404 虽然http localhost 8080 jsondoc http localhost 8080 jsondoc有效 我得到了我的文档 但没有用户界面 使用您的指示http jso
  • 谷歌浏览器在alert()函数上的不可预测的行为

    正如你所看到的一种阻塞函数 例如alert 产生其输出不按顺序Google Chrome 事件队列的填充时间为setTimeout 函数 基于此代码 for var i 1 i lt 6 i function index setTimeou
  • 单击复选框时可展开和折叠功能起作用

    我使用创建了一个表jquery datatable 我也在使用响应式功能datatable使其具有响应能力 代码工作正常 但我面临的问题是表格的第一列有一个复选框 当我们将表格宽度调整为较小宽度时 可折叠选项将如下所示 现在当我们点击che
  • Bazel:如何获取输出二进制文件的路径?

    考虑somepath BUILD file load io grpc grpc java java grpc library bzl java grpc library proto library name bar proto srcs b
  • Android :: 如何断开与 wifi 网络的连接?

    我用谷歌搜索发现很多网站都在说 禁用 Wifi 无线电 但就我而言 我只想让 Android 设备断开与特定 wifi 网络 SSID 已知 的连接 而不关闭 WiFi 无线电 请给我一些关于这个问题的见解 哇 这不应该花一个月的时间才能得
  • Wpf 自定义日期选择器用户控件

    我想创建一个用户控件来从用户那里获取日期 它应该有三个文本框 一个代表年 月和日 我不知道如何创建它
  • 如何告诉 Android 不要缩放图像?

    我在 drawable 文件夹中有一些图片 据我了解 这些图片被解释为 drawable mdpi 现在 这些图像在使用时会缩放 取决于设备 我不想添加更多图片 因为它们不存在 而且我没有资源来创建不同分辨率的图片 我只是希望图片在更大的设
  • 用C++代码清除Linux中的终端

    好的 我一直在研究如何做到这一点 但是假设我正在运行一个在终端上有大量输出的程序 我如何从程序中清除屏幕以便我可以保持程序运行 我知道我可以直接输入clear在终端中 它清除它很好 但就像我说的 对于这个程序来说 这对我来说更有利 我发现了
  • std::string_view 文字是否保证以 null 终止?

    我知道一件微不足道的事std string view不保证以空终止 然而 我不知道是否std string view文字保证以空终止 例如 include