![](/img/trans.png)
[英]Threading A Class Member Function; Thread Initialization Through Initializer List
[英]In class initialization and initializer list
我最近发现,您不能同时拥有类初始化和初始化列表。 以下代码失败:
struct s
{
int i=0;
};
int main() {
s s1; //s1.i = 0
//s s2={42}; //fails
return 0;
}
如果删除类中的初始化,则初始化器列表可以正常工作!
有人可以向我解释为什么不允许这种事情吗?
实际上,这在C ++ 14中是允许的。
struct s
{
int i=0;
};
int main() {
s s1;
s s2 = {42}; // succeeds
}
您的编译器可能没有在C ++ 14中实现新规则。 但是,最新版本的clang接受了这一点,并在C ++ 14模式下执行了正确的操作。
当将类内初始化添加到C ++ 11时,它被指定为防止类成为聚合。 这样做是因为当时聚合概念与PoD类型密切相关,而PoD类型则需要简单地构造。 具有类内初始化意味着类型不再是普通可构造的。 但是从那时起,这两个概念变得更加独立,因此对于C ++ 14来说,一个简短的提议可以扭转该决定,因此被接受。
此初始化:
s s1 = { 42 };
要求s
是一个集合 ,或者它具有一个有效的构造函数,该构造函数采用int或std::initializer_list
。
当你在声明中对添加成员初始化,您呈现类s
一个非集合,这样你就可以不再使用集合初始化。
通过添加构造函数,可以对非聚合使用相同的初始化语法 :
struct s
{
s(int i) : i(i) {}
int i=0;
};
我相信对于C ++ 14,此限制已经放宽了。
有关更多信息,请参见什么是聚合 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.