2013-07-29 59 views
52

考虑:奇怪的行为[第1部分]

struct box 
{ 
    int array[3]; 
}; 

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

如果在C++以上的作品,那么为什么不下面的工作?

struct box 
{ 
    int simple_int; 
}; 

int main() 
{ 
    box b = 2; 
} 

是什么原因?

回答

84

得当,前者将使用box a = { { 1 } },让你有一个大括号每个骨料。外面的一组大括号用于结构,内层用于数组。但是,该语言允许您省略内括号。

在后者中,没有内省括号可以省略。你不允许省略外括号;您必须至少有一组花括号来区分汇总的初始化器列表。从某种意义上说,大括号中的“这里列出了要汇总的内容”。当你编写box b = 2时,编译器不知道你想把2放在的聚合内。相反,它看起来像你试图初始化b对象(而不是它的一部分)到2。因此,编译器会尝试查找将2更改为box的构造函数或转换。当这失败时,你会得到一个错误。

+5

即使我们被允许声明为int:int i = {10};' –

+7

@GrijeshChauhan:我省略了它,因为它不相关并且使讨论复杂化。问题是为什么我们不能省略大括号,为什么我们可以添加它们。语言规范分别对待标量是特殊情况,而不是聚合规则的一部分。 –

+2

谢谢Grijesh,我不知道! –

17

它不起作用,因为你的语法错了。如果这是你想要的,你可以用一个隐含的构造函数添加对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 
+0

与'char * s =“A”'和'char * s = {“A”}类似的退出是可能的。 –

+1

@GrijeshChauhan:实际上'char * s =“A”'在C++ 11中是不可能的(无警告)。你必须使用'const'。 (好'char *'为字符串文字是**弃用**,迂腐) – Nawaz

+1

@Nawaz有趣,所以我必须做:'const char * s = {“A”}或'const char * s =“A”'in C++ 11 **?** –