使用初始化列表初始化模板变量

时间:2019-05-22 22:07:50

标签: c++ c++11

我看了一段代码,试图理解它的工作原理,所以这里是一个最小的工作示例

template <typename T>
class A
{
public:
    A() : _mem(T()) {};
private:
    T   _mem;
};

我不清楚的第一件事是初始化程序列表中_mem的初始化。这种技术叫什么?如果我在调试器中查看_mem设置为0,如果有c ++ 11的方法可以执行相同的操作,我会对此发表一些评论吗?

2 个答案:

答案 0 :(得分:2)

如果有名字,我不知道。

发生了什么事

T()构造一个临时TZero 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>