为带有大括号的非数组对象赋值合法吗
Is it legitimate to assign values to non-array objects with braces?
我偶然发现这在程序主体中有效:(目前使用g++5.2.0)
Vector4 pos;
pos = {0.0, 1.1, 2.2, 3.3};
Vector4类将这些数据声明为命名变量:
double t, x, y, z;
不是作为数组,并且没有自动转换cnstrs。
我想内存存储是连续的,所以编译器可以弄清楚该怎么办。但这种使用是否合法,或者是否可以使用未分配的内存,或者可能存在其他问题?
引用cppreference.com
如果右边的操作数是一个支持的初始化列表
表达式E1={}等价于E1=T{},其中T是E1的类型。
表达式E1={E2}等价于E1=T{E2},其中T是E1的类型。
对于类类型,语法E={e1,e2,e3}生成对赋值的调用运算符,该运算符以braked init list作为参数,然后选择遵循重载规则的适当赋值运算符分辨率
因此,您的代码相当于
pos = Vector4{0.0, 1.1, 2.2, 3.3};
编译器执行临时对象的聚合初始化,然后使用Vector4
的赋值运算符将生成的对象赋值给pos
。
使用非常安全。请注意,如果您的Vector4
是非聚合的(例如,具有用户定义的构造函数),那么聚合初始化将不起作用(即,您会遇到编译时错误)。因此,代码编译的事实意味着你是安全的。
各位,感谢您的解释。一个琐碎的测试程序显示了调用两次的默认cnstr,后跟赋值运算符。这些是:
Vector4() : t(0.0), x(0.0), y(0.0), z(0.0) {}
和
Vector4 const &operator =(const Vector4 &v) {
if(this != &v) {t=v.t; x=v.x; y=v.y; z=v.z;}
return *this;
}
相关文章:
- 将对象数组的引用传递给函数
- 如何使用Visual Studio 2017在C++中为参数化对象数组使用唯一指针
- 在c++中尝试对对象数组进行排序时,出现std:bad_alloc错误
- 类对象数组的问题会导致崩溃
- Arduino C++在构造函数中用参数声明对象数组
- 使用对象数组对 SFML 进行动画处理
- C++ 对象数组堆栈溢出
- 如何将对象数组作为参数传递给模板
- 使用向量初始化参数化构造函数的对象数组
- 如何初始化对象数组?
- C++创建对象数组
- 在对象数组中搜索字符串并返回相应值的函数
- 有没有办法使用该类的构造函数初始化另一个类的私有部分内的对象数组?
- 如何在运行时在对象数组中动态追加新对象C++并打印它们
- 为什么我在声明对象数组时不能使用 -> 运算符?
- 编译时生成应在构造函数中创建的非 constexpr 对象数组
- 使用 C++ 创建对象数组
- 对象数组打印空白字符串
- 重载运算符 [] 用于从对象数组中给出特定索引
- 如何在 C++ 中使用提升属性树从 JSON 文件中读取对象数组