我有这个简单的结构和一个函数:
struct S
{
int a;
};
void foo(S){}
foo({5});
这很好用。
但如果我将int a;
更改为int a{0};
VisualStudio(2013年和2015年)抱怨:
error C2664: 'void foo(S)': cannot convert argument 1 from 'initializer list' to 'S'
我在文档中找不到相应的规则。但gcc
和clang
都可以毫无问题地接受这一点。
答案 0 :(得分:2)
struct S
{
int a;
};
是一个聚合 而
struct S
{
int a {0}; // or int a = 0;
};
不是c ++ 11中的聚合,但是在c ++ 14中。
VisualStudio(2013和2015)在这方面仍然使用c ++ 11规则。
foo({5});
对聚合有效。对于非聚合,它将(尝试)调用适当的构造函数,但S
没有一个对此参数有效。