Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;关于模板中的泛型初始化_C++_Templates_Initialization_Generic Programming_Function Templates - Fatal编程技术网

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

C++ C++;关于模板中的泛型初始化,c++,templates,initialization,generic-programming,function-templates,C++,Templates,Initialization,Generic Programming,Function Templates,我正在编写一个通用函数,如下所示 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> v

我正在编写一个通用函数,如下所示

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>();
我可以看到初始化值是
0
,正如我所期望的那样

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


我无法理解这两行后面的区别以及发生这种情况的原因是什么?

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

这是默认初始化:

 T a;
这是一个值初始化,使用:

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

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

 T a();
但是C++11允许您像这样初始化值:

 T a{};
 T a();
 T a{};