考虑:
struct box
{
int array[3];
};
int main()
{
box a = {1};
}
如果上述内容适用于C ++,那么为什么以下不起作用呢?
struct box
{
int simple_int;
};
int main()
{
box b = 2;
}
是什么原因?
答案 0 :(得分:86)
正确地说,前者会使用box a = { { 1 } }
,因此每个聚合都有一组大括号。外部括号组用于结构,内部组用于阵列。但是,该语言允许您省略内括号。
在后者中,没有内部括号可以省略。你不能省略外括号;您必须至少有一组大括号来区分聚合的初始值设定项列表。从某种意义上说,大括号说“这里有一个列在聚合内的东西。”当你写box b = 2
时,编译器不知道你想把2
放在里面强>聚合。相反,您似乎正在尝试将b
对象(而不是其中的一部分)初始化为2
。因此,编译器会尝试查找将2
更改为box
的构造函数或转换。如果失败,则会出错。
答案 1 :(得分:18)
它不起作用,因为您的语法错误。您可以使用隐式构造函数添加对b = 2的支持,如果这是您想要的。
box b = {2}; // correct syntax with no constructor
或者
struct box
{
// implicit constructor
box(int i) : i(i) {}
int i;
};
box b(2);
box c = 2;
或者
struct box
{
explicit box(int i) : i(i) {}
int i;
};
box b(2);
box c = 2; // disallowed