我看了一段代码,试图理解它的工作原理,所以这里是一个最小的工作示例
template <typename T>
class A
{
public:
A() : _mem(T()) {};
private:
T _mem;
};
我不清楚的第一件事是初始化程序列表中_mem的初始化。这种技术叫什么?如果我在调试器中查看_mem设置为0,如果有c ++ 11的方法可以执行相同的操作,我会对此发表一些评论吗?
答案 0 :(得分:2)
如果有名字,我不知道。
发生了什么事
T()
构造一个临时T
并Zero Initializes。
_mem(T())
使_mem
成为临时T
的副本。注意:现代编译器几乎可以肯定elide the copy,并且只需将_mem
初始化为零。这仍然要求T
是可复制或移动的,因此_mem(T())
和_mem()
并不完全相同。
我能想到的唯一与C ++ 11相关的区别是,您可以为List Initialization使用大括号_mem{T{}}
。这里没有用,但是在其他情况下非常有用。
答案 1 :(得分:2)
当A::_mem
是POD类型或内置类型(例如T
)时,这只是为了防止未初始化的int
。使用: _mem(T())
的构造方法初始值设定项列表将默认构造T
并用其初始化_mem
。例如:
struct POD {
int num;
};
// ...
A<POD> a;
此处,a._mem
将被统一化(在这种情况下,这意味着a._mem.num
被统一化了。): _mem(T())
阻止了这种情况的发生,并将a._mem.num
初始化为0。
但是,由于C ++ 11,您只能使用内联初始化:
template <typename T>
class A {
public:
A() {};
private:
T _mem{};
};
T _mem{};
将默认构造_mem
,这反过来意味着POD::num
将被默认构造,对于int
则将其初始化为零。 / p>