54

考虑:

struct box
{
    int array[3];
};

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

如果上述方法在 C++ 中有效,那么为什么以下方法无效?

struct box
{
    int simple_int;
};

int main()
{
    box b = 2;
}

是什么原因?

4

2 回答 2

89

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

在后者中,没有可省略的内括号。不允许省略外括号;您必须至少有一组大括号来区分聚合的初始值设定项列表。从某种意义上说,大括号表示“这是要放入聚合中的内容列表”。当您编写box b = 2时,编译器不知道您要放入2 聚合内。相反,您似乎正在尝试将b对象(而不是其中的一部分)初始化为2. 所以编译器试图找到一个构造函数或一个将 a 更改2为 a的转换box。当这失败时,你会得到一个错误。

于 2013-07-29T13:57:44.700 回答
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
于 2013-07-29T13:55:27.987 回答