C++对象构造方法之间的区别

2024-01-03

C++ 中不同的构造语法总是让我有点困惑。在另一个问题 https://stackoverflow.com/questions/48255276/why-does-stdstring-x00-report-length-of-0/48255303,建议尝试像这样初始化一个字符串

std::string foo{ '\0' };

这可以工作并产生预期结果:长度为 1 且仅包含空字符的字符串。在测试代​​码时,我不小心输入了

std::string foo('\0');

这编译得很好(即使使用也没有警告-Wall),但在运行时终止

terminate called after throwing an instance of 'std::logic_error'
  what():  basic_string::_M_construct null not valid
Aborted (core dumped)

现在,据我所知,没有构造函数 http://en.cppreference.com/w/cpp/string/basic_string/basic_string for std::string它以单个字符作为参数,当我尝试间接传递该字符时,这个假设得到了进一步证实。

char b = '\0';
std::string a(b);

这会产生一个不错的、冗长的编译错误。正如这个

std::string a('z');

所以我的问题是:什么允许std::string a('\0');编译,以及它与std::string a{ '\0' };?


Footnote: Compiling using g++ on Ubuntu. This doesn't strike me as a compiler bug, but just in case...


特点'\0'可以隐式转换为整数值0从而代表实现定义的空指针常量. This:

std::string foo('\0');

调用接受类型指针的构造函数重载const char*作为参数并导致未定义的行为。 就相当于通过了0 or NULL:

std::string foo(0); // UB
std::string bar(NULL); // UB

The 参考 http://en.cppreference.com/w/cpp/string/basic_string/basic_string对于第四个和第五个构造函数重载状态:

如果 s... 包括 s 是 a 的情况,则行为未定义无效的 指针.

第二个声明:

std::string foo{'\0'}; // OK

调用构造函数接受std::initializer_list<char>作为参数并且不会导致 UB。

您可以调用构造函数重载接受count数量char改为:

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

C++对象构造方法之间的区别 的相关文章

  • 使用Physics.Raycast 和Physics2D.Raycast 检测对象上的点击

    我的场景中有一个空的游戏对象 带有 2D 组件盒碰撞器 我将脚本附加到该游戏对象 void OnMouseDown Debug Log clic 但是当我点击我的游戏对象时 没有任何效果 你有什么想法 如何检测我的盒子碰撞器上的点击 使用光
  • C++ 中本地类中的静态成员变量?

    我知道我们不能宣布static本地类中的成员变量 但其原因尚不清楚 那么请问有人可以解释一下吗 另外 为什么我们不能访问非static函数内部定义的变量 内部已经定义了局部类 直接在局部类成员函数中 在下面给出的代码中 int main i
  • 向 Nhibernate 发出 SQL 查询

    如何将此 SQL 查询发送给 Nhibernate SELECT Customer name FROM Company INNER JOIN Customer ON Company CompanyId Customer CompanyId
  • 互斥体实现可以互换(独立于线程实现)

    所有互斥体实现最终都会调用相同的基本系统 硬件调用吗 这意味着它们可以互换吗 具体来说 如果我使用 gnu parallel算法 使用openmp 并且我想让他们称之为线程安全的类我可以使用boost mutex用于锁定 或者我必须编写自己
  • 单击 form2 上的按钮触发 form 1 中的方法

    我对 Windows 窗体很陌生 我想知道是否可以通过单击表单 2 中的按钮来触发表单 1 中的方法 我的表格 1 有一个组合框 我的 Form 2 有一个 保存 按钮 我想要实现的是 当用户单击表单 2 中的 保存 时 我需要检查表单 1
  • 将 Excel 导入到 Datagridview

    我使用此代码打开 Excel 文件并将其保存在 DataGridView 中 string name Items string constr Provider Microsoft Jet OLEDB 4 0 Data Source Dial
  • 未定义的行为或误报

    我 基本上 在野外遇到过以下情况 x x 5 显然 它可以在早期版本的 gcc 下编译干净 在 gcc 4 5 1 下生成警告 据我所知 警告是由 Wsequence point 生成的 所以我的问题是 这是否违反了标准中关于在序列点之间操
  • 在一个字节中存储 4 个不同的值

    我有一个任务要做 但我不知道从哪里开始 我不期待也绝对不想要代码中的答案 我想要一些关于该怎么做的指导 因为我感到有点失落 将变量打包和解包到一个字节中 您需要在一个字节中存储 4 个不同的值 这些值为 NAME RANGE BITS en
  • Java字符串查找和替换的最佳方法?

    我正在寻找 Java 中字符串查找和替换的最佳方法 这是一句话 我的名字叫米兰 人们都知道我叫米兰瓦西奇 我想用 Milan Vasic 替换 Milan 弦 但在我已经有 Milan Vasic 的地方 情况不应该是这样 搜索 替换后的结
  • 如何使用 watin 中的 FileUploadDialogHandler 访问文件上传对话框

    我正在使用 IE8 和 watin 并尝试通过我的网页测试上传文件 我不能简单地使用 set 方法设置上传文件 例如 ie FileUpload Find ById someId Set C Desktop image jpg 因为上传文本
  • 如何在 Blackberry Cascades 中显示具有特定号码的电话板

    我正在使用带有 C QT 和 QML 的 Blackberry Cascades 10 Beta 3 SDK 以及 Blackberry 10 Dev Alpha Simulator 和 QNX Momentics IDE 并且我正在尝试实
  • 如何将自定义 JSON 文件添加到 IConfiguration 中?

    我正在使用 asp net Autofac 我正在尝试加载自定义 JSON 配置文件 并基于该文件创建 实例化 IConfiguration 实例 或者至少将我的文件包含到默认情况下构建的 IConfiguration asp net 中
  • 如何使用 Mongodb C# 驱动程序连接多个集合

    我需要将 3 个集合与多个集合合并在一起 lookup我在 C 驱动程序中尝试过 它允许我 lookup用户采集但无法执行秒 lookup用于设置集合 有人可以帮忙吗 db Transactions aggregate lookup fro
  • 如何对 Web Api 操作进行后调用?

    我创建了一个 Web API 操作 如下所示 HttpPost public void Load string siteName string providerName UserDetails userDetails implementat
  • (de)从 CSV 序列化为对象(或者最好是类型对象的列表)

    我是一名 C 程序员 试图学习 C 似乎有一些内置的对象序列化 但我在这里有点不知所措 我被要求将测试数据从 CSV 文件加载到对象集合中 CSV 比 xml 更受青睐 因为它更简单且更易于人类阅读 我们正在创建测试数据来运行单元测试 该集
  • memset 未填充数组

    u32 iterations 5 u32 ecx u32 malloc sizeof u32 iterations memset ecx 0xBAADF00D sizeof u32 iterations printf 8X n ecx 0
  • 检查Windows控制台中是否按下了键[重复]

    这个问题在这里已经有答案了 可能的重复 C 控制台键盘事件 https stackoverflow com questions 2067893 c console keyboard events 我希望 Windows 控制台程序在按下某个
  • 使用 Scala 在 Apache Spark 中拆分字符串

    我有一个数据集 其中包含以下格式的行 制表符分隔 Title lt t gt Text 现在对于每个单词Text 我想创建一个 Word Title 一对 例如 ABC Hello World gives me Hello ABC Worl
  • 在客户端系统中安装后桌面应用程序无法打开

    我目前正在使用 Visual Studio 2017 和 4 6 1 net 框架 我为桌面应用程序创建了安装文件 安装程序在我的系统中完美安装并运行 问题是安装程序在其他计算机上成功安装 但应用程序无法打开 edit 在客户端系统中下载了
  • 如何正确使用 std::condition_variable?

    我很困惑conditions variables以及如何 安全 使用它们 在我的应用程序中 我有一个创建 gui 线程的类 但是当 gui 是由 gui 线程构造时 主线程需要等待 情况与下面的函数相同 主线程创建互斥体 锁和conditi

随机推荐

  • 在 Solaris 上构建 Node.JS:“使用 仅在 c99 编译环境中有效。”

    我正在尝试在 Solaris 上安装 Node JS 这是开箱即用的 Solaris 9 10 x86 最新版本是 2010 年 9 月 并且仅使用默认软件包 我遵循的方向在这里 https github com joyent node w
  • 在Android 4.0.3中设置textview淡入淡出

    我刚刚尝试实现淡入淡出效果TextView在安卓4 0 3中 然而 它不起作用 fadingEdge horizontal singleLine true ellipsize marquee 此代码适用于 2 3 7 及以下版本 但不适用于
  • Dart 作为 Worker 进行隔离

    编辑以使问题更清楚 我正在尝试在 Dart 中使用 Isolates 或 Web Workers 我能找到在主线程和隔离线程之间进行通信的唯一方法是send and 打电话然后从主线程 但这是主线程将一些数据传递给隔离的好方法 如果我希望分
  • GitHub 推送错误 - “git 媒体更新”

    我一直在使用 GitHub for Mac 客户端 两个月来它一直工作得很好 昨天 成功提交和推送后 我的客户端自行关闭然后重新启动 从那时起 我就无法将更改推送到我的在线存储库 在客户端中 我收到消息 git media pre push
  • 在Sikuli拍照的命令是什么

    我正在使用 Sikuli IDE 我想知道截屏的命令是什么 这样我就可以在测试结束时捕获屏幕 像这样的东西 try if bla bla bla print blablabla else TAKESCREENSHOT gt What com
  • 在 stripes actionbean 中绑定隐藏字段时,隐藏字段变为 null

    我有一个条纹操作页面 当页面加载时 我想通过从对象 即 setOriginalAssignee userAction getAssignee 分配原始Assignee 来保存它 这样 如果对象的字段受让人发生更改 我将进行一些计算 这是我的
  • 计算根的父母拥有的百分比

    简而言之 我试图计算树的父级所拥有的树根的百分比 即树的更上层 我怎样才能单独用 SQL 来做到这一点 这是我的 示例 架构 请注意 虽然层次结构本身非常简单 但还有一个附加的holding id 这意味着单亲父母可以 拥有 孩子的不同部分
  • 如何使用 SymPy codegen 生成 Fortran 子例程

    我想使用 SymPy codegen 实用程序生成 Fortran 子例程 我可以毫无问题地生成 Fortran 函数codegen f x y z f95 filename 但我想生成一个 Fortran 子例程 以便可以修改输入数组 我
  • 将 ZedGraph 中的 DateAsOrdinal xAxis 标签格式化

    我现在已经改变了我的x axis to 日期为序号 但我想改进标签格式 我目前处理的是XAxis ScaleFormatEvent像这样 Private Function OnXScaleFormatEvent ByVal pane As
  • C++11 移动语义是在做一些新的事情,还是只是让语义更清晰?

    我基本上想弄清楚 整个 移动语义 概念是全新的 还是只是使现有代码更易于实现 我总是对减少调用复制 构造函数的次数感兴趣 但我通常使用引用 可能还有 const 来传递对象 并确保我始终使用初始化列表 考虑到这一点 并查看了整个丑陋的 语法
  • 向 C# 控制台应用程序添加“--help”参数

    我通过命令行使用的几乎所有 exe 都有一个由 help 命令调用的帮助函数 我如何在 C 中实现这个 难道只是检查args 中的参数是否是字符串 help 那么简单吗 使用 nix 命令 通常可以通过以下方式获取帮助 h or help
  • 如何在android中将数据库写入文本文件

    我正在为我的大学项目开发 一个间谍应用程序 为此 我记录了设备的通话 位置和短信并将它们存储在数据库中 现在我想将数据库的内容导出到文本文件 我尝试了下面的代码 private void readAndWriteCallsData File
  • 声明时没有实例化对象的原因是什么?

    最近我不得不深入研究一些 VB6 代码 我到处都看到了这种模式 dim o as obj set o new obj 为什么不是这个 dim o as new obj 我记得15年前有一个很好的理由 但现在我不记得是什么了 有人记得吗 理由
  • 检查元素是否为 div

    我如何检查是否 this is a div ul or blockquote 例如 if this is a div alert its a div else alert its not a div some other stuff 像这样
  • 蒙古人名的处理

    有几个国家 土耳其 蒙古 吉尔吉斯斯坦等 通常男性的名字可以没有中间名 而是使用 oglu uulu 等词代替 例如 Michael oglu Bret 意思是 布雷特的迈克尔儿子 我曾经把这类词分开 并把它们当作中间名 所以在过去的一周里
  • 在画布绘图上设置触摸监听器

    假设我在画布上绘制了位图图像或简单的圆圈 如何设置 OnTouchListener 来检查我的绘图是否被触摸 由于我将在画布上绘制多个圆圈 因此我希望每个圆圈都有一些唯一的 ID 以便我可以相应地工作 当您触摸屏幕时 获取 x 和 y 坐标
  • C# 和 SIMD:高加速和低加速。怎么了?

    问题介绍 我正在尝试加快我正在编写的 2d 光线追踪器的相交代码 我使用 C 和 System Numerics 库来提高 SIMD 指令的速度 问题是我得到了奇怪的结果 有超顶加速和相当低的加速 我的问题是 为什么一个是在屋顶之上 而另一
  • 计算多部分/表单数据编码文件的大小

    我正在编写一个应该接收文件并存储它的应用程序 一种存储方式是将其上传到另一台服务器 例如 filehoster 服务器端我使用Python和金字塔框架 我已经解决了客户端上传时获取文件的问题 并包装了返回的应用程序make wsgi app
  • CSS:居中块,但内容向左对齐

    我希望整个块位于其父级的中心 但我希望块的内容左对齐 例子最有效 在本页 ascii 艺术应该居中 正如它所显示的那样 但它应该对齐并且看起来像 YAML 或这个 http yaml online parser appspot com ya
  • C++对象构造方法之间的区别

    C 中不同的构造语法总是让我有点困惑 在另一个问题 https stackoverflow com questions 48255276 why does stdstring x00 report length of 0 48255303