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