1

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

4

2 回答 2

2

在 C++11 中,当类型T是聚合类型时,初始化 using{ ... }执行聚合初始化。聚合初始化总是初始化 的成员T,而不是T自身。

尽管这正是标准所要求的,但这是不需要的,这就是为什么在未来的标准中,规则可能会被更改,以便为从相同类型的初始化设置特殊例外。这是核心语言问题 1467。

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

于 2014-02-20T12:44:07.020 回答
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};
于 2014-02-20T12:34:30.790 回答