C ++中结构的奇怪行为

考虑:

struct box { int array[3]; }; int main() { box a = {1}; } 

如果上述工作在C ++那么为什么不下面的工作?

 struct box { int simple_int; }; int main() { box b = 2; } 

是什么原因?

正确地说,前者将使用box a = { { 1 } } ,以便每个聚合都有一组大括号。 外套是用于结构的,内套是用于arrays的。 但是,该语言允许您省略内括号。

在后者中,没有内在的大括号可以省略。 你不能省略外括号。 您必须至less有一组花括号来区分汇总的初始值设定项列表。 从某种意义上说,大括号是“这里是要放入聚合内的东西的列表”。当你写box b = 2 ,编译器不知道你想把2 放在聚合内。 相反,它看起来像你试图初始化b对象(而不是它的一部分)为2 。 所以编译器试图find一个构造函数或一个将2变成一个box的转换。 当这失败,你会得到一个错误。

它不工作,因为你的语法是错误的。 如果这是你想要的,你可以用一个隐含的构造函数来添加对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