考虑:奇怪的行为[第1部分]
struct box
{
int array[3];
};
int main()
{
box a = {1};
}
如果在C++以上的作品,那么为什么不下面的工作?
struct box
{
int simple_int;
};
int main()
{
box b = 2;
}
是什么原因?
考虑:奇怪的行为[第1部分]
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
。因此,编译器会尝试查找将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
与'char * s =“A”'和'char * s = {“A”}类似的退出是可能的。 –
@GrijeshChauhan:实际上'char * s =“A”'在C++ 11中是不可能的(无警告)。你必须使用'const'。 (好'char *'为字符串文字是**弃用**,迂腐) – Nawaz
@Nawaz有趣,所以我必须做:'const char * s = {“A”}或'const char * s =“A”'in C++ 11 **?** –
即使我们被允许声明为int:int i = {10};' –
@GrijeshChauhan:我省略了它,因为它不相关并且使讨论复杂化。问题是为什么我们不能省略大括号,为什么我们可以添加它们。语言规范分别对待标量是特殊情况,而不是聚合规则的一部分。 –
谢谢Grijesh,我不知道! –