C ++中结构的奇怪行为[第1部分]

时间:2013-07-29 13:52:39

标签: c++

考虑:

struct box
{
    int array[3];
};

int main()
{
    box a = {1};
}

如果上述内容适用于C ++,那么为什么以下不起作用呢?

struct box
{
    int simple_int;
};

int main()
{
    box b = 2;
}

是什么原因?

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