到位成员初始化和聚合初始化

时间:2016-03-03 10:17:12

标签: c++ c++11 visual-c++ initialization

我有这个简单的结构和一个函数:

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'

我在文档中找不到相应的规则。但gccclang都可以毫无问题地接受这一点。

1 个答案:

答案 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没有一个对此参数有效。

相关问题