带大括号的结构初始化/赋值

2023-11-21

我定义了一个结构体,如下所示:

struct float3 {
float x; 
float y;
float z;

float3 () : x(0), y(0), z(0) {}
float3 (float a, float b, float c) : x(a), y(b), z(c) {}
};

但在理解初始化/为其成员赋值的不同方式时,我遇到了麻烦。例如:

//Initialization
float3 3Dvec = {1.0, 1.0, 1.0};
float3 3Dvec2 {1.0, 1.0, 1.0};
float3 3Dvec3 (1.0, 1.0, 1.0);

//Assignment
3Dvec = {2.0, 2.0, 2.0};
3Dvec = float3 (2.0, 2.0, 2.0);

所有这些选项都适用于 -std=c++11。然而,在带有 -std=c++0x 大括号的旧编译器上初始化/赋值不起作用。使用牙套是一种不好的做法吗?哪个选项更好习惯?


在C++11中,所有这些都是合法的。如果您知道您将使用兼容 C++11 的编译器(至少就列表初始化而言),我认为最好使用大括号语法。它是面向未来且明确的。

下面对各个说法进行详细分析:

float3 vec3D = {1.0, 1.0, 1.0};

复制列表初始化。严格按照书本,这会创建一个临时的float3通过调用其 3 参数构造函数,然后初始化vec3D通过使用移动构造函数(或复制构造函数,如果没有可用的移动构造函数),最后销毁临时对象。

实际上,临时创建和移动/复制操作将被任何未损坏的编译器省略,因此不存在效率低下的情况。However,请注意,它要求移动/复制构造函数可访问。例如,您不能像这样初始化不可移动、不可复制的类。

float3 vec3D2 {1.0, 1.0, 1.0};
float3 vec3D3 (1.0, 1.0, 1.0);

Both of these directly initialise vec3D2 by calling its 3-parameter constructor. I'd say the brace one is the optimal syntax, because it's unambiguous. In this particular case, it does not matter, but sometimes, using parentheses can lead to a (most) vexing parse1.

vec3D = {2.0, 2.0, 2.0};
vec3D = float3 (2.0, 2.0, 2.0);

只要类型相同,它们都是 100% 相同的vec3D is float3。两者都会创建一个临时的float3使用其 3 参数构造函数的对象,将该对象传递给 的移动(或复制)赋值运算符vec3D,然后销毁临时的。

我认为支架更好,因为它是面向未来的。如果您稍后重命名该类,大括号类将继续按原样工作,而括号类将需要名称更改。另外,如果您更改类型vec3D,大括号仍然会创建一个对象vec3D的类型,而第二个将继续从 a 进行创建和分配float3目的。不可能一概而论,但我想说前一种行为通常是首选。


1 An example of that would be:

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

带大括号的结构初始化/赋值 的相关文章

随机推荐

  • 使用 Update 且 Upsert 为 true 时未设置默认值

    我为用户提供以下模型 var UserSchema new mongoose Schema name String dob Date sex String photo String email type String index uniqu
  • boost::interprocess::shared_ptr 线程安全(和进程间安全)吗?

    我想在线程之间共享数据 并在最后一个用户使用完数据后自动删除数据 大多数时候 这似乎有效 使用boost interprocess shared ptr in a boost fixed managed shared memory段 但并非
  • 使用@Preauthorize和@@ControllerAdvice自定义错误消息

    我们正在使用 spring 和 spring security 3 2 最近我们正在向 RestAPI 添加注释 PreAuthorize 之前它是基于 URL 的 PreAuthorize hasPermission salesorder
  • 将 getdate() 转换为 int

    当我运行以下查询时 select convert int getdate 我得到结果 41238 1 row s affected 有谁知道这是什么意思 这是我想的天数1 1 1900 sql server 保留从那时起的天数 尝试将该数字
  • 使用 Go 解析带有尾随逗号的 JSON 数组和映射元素时出现运行时错误

    Go 领域的主要主题专家之一 Dave Cheney 写道 当使用复合文字初始化变量时 Go 要求复合文字的每一行都以逗号结尾 甚至是声明的最后一行 这就是结果分号规则 然而 当我尝试将这个美丽的规则应用于 JSON 文本时 解析器似乎并不
  • 防止 HTML 表单操作被更改

    我的页面上有一个表单 用户可以在其中输入信用卡数据 是否可以在 HTML 中将表单的操作标记为常量 以防止恶意 JavaScript 更改表单的操作属性 我可以想象 XSS 攻击会更改表单 URL 使用户将其秘密数据发布到攻击者的站点 是否
  • 点击时隐藏 Twitter Bootstrap 导航折叠

    这不是一个子菜单下拉菜单 类别是 li 类 如图所示 通过从响应式菜单中选择一个类别 模板只是 一页 我想在点击时自动隐藏导航折叠 也可以漫步用作导航 因为模板只有一个 页 我寻求一个不影响它的解决方案 这里是HTML代码 菜单 div c
  • 使用 Apache 服务器运行 Silverlight(Linux 下)

    我需要将 Silverlight 2 0 应用程序部署到 Apache 服务器 但它是在 Linux 下 这可能吗 我的意思是 我需要在服务器中安装 Net 3 5 以及可以执行 Asp Net 的网站吗 谢谢你的帮助 如果 apache
  • defrecord 构造函数中未强制执行类型提示

    我使用创建了一个类型defrecord带有字段的类型提示 然而 我发现这些类型提示在构造函数中没有强制执行 我可以用它们做一些奇怪的事情 例如 请看下面的代码片段 user gt defrecord Person String name I
  • RegExp 去除 HTML 注释

    寻找匹配和替换的正则表达式序列 最好是 PHP 但并不重要 来改变这一点 开始和结束只是需要保留的随机文本 IN fkdshfks khh fdsfsk div class codetop CODE AutoIt div div class
  • Android 闹钟 UI

    我试图弄清楚 Android 闹钟应用程序的 UI 是如何设计的 这似乎正在使用 Holo 黑暗主题 包含的屏幕截图是创建 编辑警报Activity屏幕 它看起来类似于安卓设置 有这种情况吗 因为 打开闹钟 和 振动 行看起来像Chexbo
  • 如何向此 ASP.NET DropDownList 控件添加默认的“选择”选项?

    我是一名新的 ASP NET 开发人员 我正在尝试学习 Linq To Entities 我正在尝试将 DropDownList 与 Linq 语句绑定 以检索状态实体中的状态列表 一切正常 但是 我现在尝试将 选择 选项添加到 DropD
  • Ace Editor 可以在一个页面中支持多个代码编辑器吗?

    我正在寻求实现一个网络应用程序 该应用程序具有 编码竞赛 风格的界面 在一个屏幕上有 2 个不同的代码编辑器 一个将是只读的 另一个将是活动的并允许用户进行编辑 我目前正在使用 Ace Editor 我发现它非常棒且易于使用 然而 这是我的
  • 如何找到列表的所有子序列?

    我正在尝试学习如何列表理解 并且正在尝试找出一种方法来查找列表的所有子序列 但我不太确定如何去做 有人可以帮助我吗 如果您想访问此功能 您可以使用subsequences函数位于Data List subsequences 1 2 3 gt
  • 无法向 weblogic 队列发送消息

    我正在尝试将字符串消息发送到在 weblogic 服务器中创建的 JMS 队列中 我正在使用 Eclipse ide 当我运行 Web 应用程序时 出现以下错误 并且 tomcat 服务器关闭 错误是 javax naming Commun
  • 如何将midi时间线转换为应该播放的实际时间线

    我已经研究这个主题有一段时间了 但仍然没有弄清楚 我使用 midas3 库 Midi actionscript3 将 midi 导入到 flash 我在时间线上得到了每个笔记项目 我得到分度值 192 所有 GET TEMPO 元素都等于
  • Asp.Net 获取屏幕宽度

    如何在 Asp net C 项目中获取服务器端的屏幕宽度 将其放在您的表格上
  • 如何用sympy判断一个函数是否连续?

    我需要定义一个函数来检查输入函数在 sympy 的某个点是否连续 我用关键字 连续性 搜索了 sympy 文档 但没有现有的函数 我想也许我应该考虑限制一下 但我不知道该怎么做 def check continuity f var a tr
  • Android:Firebase登录失败密码无效或用户没有密码

    我正在尝试使用 firebase 创建一个带有用户个人资料的简单应用程序 但遇到了问题 注册功能运行良好 我可以在 Firebase 控制台中看到注册帐户 但登录功能运行不佳 我收到 密码无效或用户没有密码 例外 任何人都可以帮我解决这个问
  • 带大括号的结构初始化/赋值

    我定义了一个结构体 如下所示 struct float3 float x float y float z float3 x 0 y 0 z 0 float3 float a float b float c x a y b z c 但在理解初