考虑:
struct box
{
int array[3];
};
int main()
{
box a = {1};
}
如果上述方法在 C++ 中有效,那么为什么以下方法无效?
struct box
{
int simple_int;
};
int main()
{
box b = 2;
}
是什么原因?
考虑:
struct box
{
int array[3];
};
int main()
{
box a = {1};
}
如果上述方法在 C++ 中有效,那么为什么以下方法无效?
struct box
{
int simple_int;
};
int main()
{
box b = 2;
}
是什么原因?
正确地,前者会使用box a = { { 1 } }
, 以便每个聚合都有一组大括号。外面的大括号用于结构,内部的花括号用于数组。但是,该语言允许您省略内大括号。
在后者中,没有可省略的内括号。不允许省略外括号;您必须至少有一组大括号来区分聚合的初始值设定项列表。从某种意义上说,大括号表示“这是要放入聚合中的内容列表”。当您编写box b = 2
时,编译器不知道您要放入2
聚合内。相反,您似乎正在尝试将b
对象(而不是其中的一部分)初始化为2
. 所以编译器试图找到一个构造函数或一个将 a 更改2
为 a的转换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