我正在编写一个如下所示的通用函数。
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;
这是一个值初始化,使用copy initialization :
T a = T();
你是对的,这里可以省略拷贝,所以这具有创建单个值初始化的 T
对象的效果。但是,它确实要求 T
是可复制的或可移动复制的。内置类型就是这种情况,但这是一个需要牢记的限制。
需要复制初始化语法,因为这是一个函数声明:
T a();
但 C++11 允许您像这样进行值初始化:
T a{};
关于C++ 关于模板中的泛型初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24303095/