什么是花括号的赋值?它可以控制吗?

30 c++

这个叫什么?

Vec3 foo = {1,2,3};
Run Code Online (Sandbox Code Playgroud)

它可以通过操作员或某些人控制吗?我可以指出这应该如何行动?

例如,如果我有一些复杂的类,我可以使用它来分配变量吗?(只是好奇心练习).

Naw*_*waz 44

那不是任务.那就是初始化.

这种初始化仅允许聚合,包括POD类.POD表示普通旧数据类型.

例,

//this struct is an aggregate (POD class)
struct point3D
{
   int x;
   int y;
   int z;
};

//since point3D is an aggregate, so we can initialize it as
point3D p = {1,2,3};
Run Code Online (Sandbox Code Playgroud)

看上面的编译很好:http://ideone.com/IXcSA

但请再考虑一下:

//this struct is NOT an aggregate (non-POD class)
struct vector3D
{
   int x;
   int y;
   int z;
   vector3D(int, int, int){} //user-defined constructor!
};

//since vector3D is NOT an aggregate, so we CANNOT initialize it as
vector3D p = {1,2,3}; //error
Run Code Online (Sandbox Code Playgroud)

以上不编译.它给出了这个错误:

prog.cpp:15:错误:在非聚合类型'vector3D'的初始化器周围括起来

看看自己:http://ideone.com/zO58c

point3D和之间有什么区别vector3D?只是vector3D具有用户定义的构造函数,这使它成为非POD.因此无法使用花括号进行初始化!


什么是聚合?

标准在第8.5.1/1节中说明,

聚合是一个数组或类 (第9节),没有用户声明的构造函数(12.1),没有私有或受保护的非静态数据成员 (第11节),没有基类(第10节),没有虚函数(10.3) ).

然后它在§8.5.1/ 2中说,

初始化聚合时,初始化程序可以包含一个初始化子句,该子句由括号括起来的逗号分隔的聚合成员初始化子句列表组成,以增加的下标或成员顺序编写.如果聚合包含子聚合,则此规则将递归地应用于子聚合的成员.

[Example:

struct A 
{
   int x;
   struct B 
   {
      int i;
      int j;
   } b;
} a = { 1, { 2, 3 } };

initializes a.x with 1, a.b.i with 2, a.b.j with 3. ]
Run Code Online (Sandbox Code Playgroud)

  • 你知道吗,下面两条语句有什么区别: std::vector<int> data {1, 2, 3}; std::vector<int> 数据 = {1, 2, 3}; (2认同)
  • @MeJ:实际上,没有区别。迂腐地说,第一个是直接初始化,第二个是复制初始化。 (2认同)