使用花括号进行聚合初始化

时间:2014-02-20 11:44:17

标签: c++ c++11 aggregate uniform-initialization

在C ++ 11中,是否允许使用花括号语法复制聚合?我有以下代码:

struct s
{
    int x;
};
template<class T>
struct holder
{
    template<class A>
    holder(A&& x) : t{x} {}
    T t;
};

以下每个陈述都有效。

auto s1 = s{1};
auto s2(s1);
auto s3{s1}; ///NOTE : this works!

但是,下面的第二个语句会引发错误cannot convert 's' to 'int' in initialization

holder<s> h{5};
holder<s> h1{s{5}};

我正在使用gcc 4.8.2。为什么我会收到此错误?

2 个答案:

答案 0 :(得分:2)

在C ++ 11中,当类型T是聚合类型时,使用{ ... }进行初始化会执行聚合初始化。聚合初始化始终初始化T的成员,而不是T本身。

虽然这正是标准所要求的,但这是不可取的,这就是为什么在未来的标准中,规则可能会被更改为从同一类型进行初始化的特殊例外。 This is core language issue 1467.

在那之前,不幸的是,你得到的错误是完全正确的,你将不得不解决它。

答案 1 :(得分:0)

首先是这段代码

struct s
{
    int x;
};
template<class T>
struct holder
{
    template<class A>
    holder(A&& x) : t{x} {}
    T t;
};

int main() 
{
    holder<s> h{5};
    return 0;
}

成功编译。

无效声明是

holder<s> h1{s{5}};

问题在于你实际上是在尝试执行

s s1 = { s{5} };

但是,当编译器尝试进行赋值时,编译器无法将类型为s的对象转换为int类型的对象(用于初始化s1.x)

s.x = s{5};