在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。为什么我会收到此错误?
答案 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};