为什么在 C++ 中使用 = 来初始化原始类型?

2023-12-22

在我工作的地方,人们大多认为对象最好使用 C++ 风格的构造(带括号)来初始化,而原始类型应该使用 = 运算符来初始化:

std::string strFoo( "Foo" );
int nBar = 5;

不过,似乎没有人能够解释为什么他们更喜欢这种方式。我理解了std::string = "Foo";效率会很低,因为它会涉及额外的副本,但是仅仅消除=完全使用运算符并到处使用括号?

这是一个共同的约定吗?其背后的想法是什么?


使用 = 运算符或使用构造函数调用初始化变量在语义上是相同的,这只是风格问题。我更喜欢 = 运算符,因为它读起来更自然。

使用 = 运算符usually不生成额外的副本 - 它只是调用普通的构造函数。但请注意,对于非基本类型,这仅适用于与声明同时发生的初始化。比较:

std::string strFooA("Foo");  // Calls std::string(const char*) constructor
std::string strFoo = "Foo";  // Calls std::string(const char*) constructor
                             // This is a valid (and standard) compiler optimization.

std::string strFoo;  // Calls std::string() default constructor
strFoo = "Foo";      // Calls std::string::operator = (const char*)

当您有重要的默认构造函数时,后一种构造可能会稍微低效。

The C++标准 http://www.parashift.com/c++-faq-lite/big-picture.html#faq-6.13,第 8.5 节第 14 段规定:

Otherwise (i.e., for the remaining copy-initialization cases), a temporary is created. User-defined conversion sequences that can convert from the source type to the destination type or a derived class thereof are enumerated (13.3.1.4), and the best one is chosen through overload resolution (13.3). The user-defined conversion so selected is called to convert the initializer expression into a temporary, whose type is the type returned by the call of the user-defined conversion function, with the cv-qualifiers of the destination type. If the conversion cannot be done or is ambiguous, the initialization is ill-formed. The object being initialized is then direct-initialized from the temporary according to the rules above.87) In certain cases, an implementation is permitted to eliminate the temporary by initializing the object directly; see 12.2.

第 12.2 节的一部分规定:

即使避免创建临时对象,也必须遵守所有语义限制,就像创建临时对象一样。 [例子: 即使不调用复制构造函数,也应满足所有语义限制,例如可访问性(11)。 ]

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

为什么在 C++ 中使用 = 来初始化原始类型? 的相关文章

随机推荐

  • 获取 DropDownMenu 的 SourceControl

    我在 ContextMenuStrip 中有两个菜单项的单击事件 我可以通过执行以下代码获取单击的上下文菜单项的 SourceControl Control c sender as ToolStripItem Owner as Contex
  • 将画布的一部分复制到图像

    我尝试复制某一部分画布 然后将复制的部分写入图像中 这是我的 错误的 方法 var c document getElementById MyCanvas ctx c getContext 2d var ImageData ctx getIm
  • 第 n 个元素的 CSS 选择器,无论父元素如何[重复]

    这个问题在这里已经有答案了 是否有第 n 个匹配元素的 CSS 选择器 无论其父元素如何 例如下面介绍如何仅选择 第二段 还没有第四个吗 div p The first paragraph p p The second paragraph
  • 从 PHP 访问 Google App Engine 的搜索 API

    有办法做到这一点吗 我看过google api php 客户端 https developers google com api client library php 图书馆 但还没有 还有其他办法还是我运气不好 正如 Mario 指出的那样
  • 如何通过 RequireJS 在 Handlebars 中使用预编译模板?

    我想预编译我的 Handlebars 模板 但我不确定这在开发模式下如何工作 常见的做法是有一些后台进程吗 Guard https github com guard guard运行以持续监控 Handlebars 模板文件的更改 我正在使用
  • 如何找到最长的连续日期序列?

    我有一个数据库 其时间戳访问时间如下 ID time 1 1493596800 1 1493596900 1 1493432800 2 1493596800 2 1493596850 2 1493432800 我使用 Spark SQL 我
  • SwiftUI:添加元素时选择器内容未刷新

    我在 VStack 中有一个 Picker 元素 但是当通过添加新元素更改其内容时 Picker 不会刷新 隐藏和显示选取器后 新元素可见 有谁知道如何刷新选择器的内容 而不需要隐藏 显示它 您可以通过创建一个新的 SwiftUI 项目并复
  • 在 Maven 构建的 EAR 内的 META-INF 目录中添加 .mf 和 .xml 文件

    我有任意 xml 和 mf 文件 我必须将它们添加到耳朵本身内的 META INF 文件夹中 使用maven2 2 1完成构建 只需将这些文件添加到 basedir src main application META INF 下就可以了 但
  • Keras-嵌入层

    什么是input dim output dim and input length意思是 Embedding input dim output dim input length 从文档中我了解到 input dim int gt 0 词汇量的
  • 使用 SQS 提供程序的 JMS MessageListener 的轮询间隔

    我正在使用亚马逊 sqs 队列异步消费消息 我已经开始使用 amazon sqs JMS api 使用消息 因此 我已经实现了 MessageListener 并在消息到达 onMessage 方法后开始工作 由于 amazon sqs 是
  • 不使用 eval 的间接方式

    我正在寻找一种干净的方法 无需 eval 命令 来间接引用数组 这是我想要的更准确的描述 function valueof echo indirection1 1 1 eval echo indirection2 1 1 Untill th
  • TabLayout 中的标题不出现

    伙计们 我在 Android 中遇到了麻烦 我的代码可以编译 但不能正常工作 我尝试使用 ViewPager 执行 TabLayout 但文本没有出现 这是代码的结构 我基于 Android Studio 自己创建的 DrawableLay
  • 如何禁用带有参数的路由的csrf保护?

    有一条路线 如 Route post user id update UserController update 我想禁用它的 csrf 保护 但我不知道如何将其 uri 添加到except array 您可以将给定的代码添加到VerifyC
  • Android自定义View(TextView+Button+一些自定义行为)?

    这应该很容易做到 但不知何故 经过 15 分钟的搜索 我仍然无法得到答案 我想制作一个结合 TextView 和 Button 的自定义 Android 视图 加上一些自定义行为 方法 假设当我单击按钮时 它应该将 TextView 更改为
  • 如何从内部关闭线程?

    对于连接到我的服务器的每个客户端 我都会生成一个新线程 如下所示 Create a new client c Client self server accept globQueue globQueueIndex globQueueIndex
  • 如何获取最新版本的代码?

    我正在使用 Git 1 7 4 1 我想从存储库获取最新版本的代码 但出现错误 git pull M selenium ant build properties M selenium scripts linux get latest upd
  • Hyperledger Fabric:使用fabric-ca-client(Javascript)注册并注册新的对等身份

    在fabric ca的文档中只有身份创建的CLI描述 使用nodejs模块 fabric ca client 我们可以使用以下方法注册和注册新用户 fabric ca client register enrollmentID user1 a
  • 将多个 .txt 文件作为数据帧加载到 python 中

    我正在努力将多个 txt 文件加载到桌面上的 python 中 我对 Python 完全陌生 我的目标是加载多个 txt 文件 这些文件保存在同一目录中 txt 文件是纯文本 在此先感谢您的帮助 你可以做这样的事情 from collect
  • Node.JS 请求 - 无效 URI“/”

    我在用着request在我的应用程序中发送POST通过 HTTPS 进行客户端身份验证的请求 请求总是抛出错误Error Invalid URI 我无能为力解决这个问题 我尝试使用 url parse 而不是传递字符串 但它仍然是相同的 r
  • 为什么在 C++ 中使用 = 来初始化原始类型?

    在我工作的地方 人们大多认为对象最好使用 C 风格的构造 带括号 来初始化 而原始类型应该使用 运算符来初始化 std string strFoo Foo int nBar 5 不过 似乎没有人能够解释为什么他们更喜欢这种方式 我理解了st