关于模板中泛型初始化的c++

C++ about generic initialization in templates

本文关键字:c++ 初始化 泛型 于模板      更新时间:2023-10-16

我正在写一个像下面这样的泛型函数。

template<class Iterator, class T>
void foo(Iterator first, Iterator last) {
   T a;
   cout << a << endl;
   // do something with iterators
 }
 typedef vector<double>::iterator DblPtr;
 vector<double> values;
 foo< DblPtr, int>();

这个函数为变量a打印一个未定义的值,而如果我将初始化更改为

   ///
   T a = T()
   cout << a << endl;
   // do something with iterators

我可以看到初始化的值是0,正如我所期望的。

如果我调用T a,变量初始化为默认值,但如果我调用T a = T(),我相信由于优化,复制构造函数应该调用T()的值,这仍然是默认的。

我不明白这两行背后的区别是什么,为什么会发生这种情况?

首先,内置类型(如int)的默认初始化使它们未初始化。值初始化使它们为零初始化。至于你的例子

这是一个默认初始化:

 T a;

这是一个值初始化,使用复制初始化:

 T a = T();

你是对的,副本可以在这里省略,所以这有创建单个值初始化的T对象的效果。然而,它确实要求T是可复制的或可移动的。这是内置类型的情况,但要记住这是一个限制。

复制初始化语法是必需的,因为这是一个函数声明:

 T a();

但是c++ 11允许像这样进行值初始化:

 T a{};