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

标签 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> 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/

相关文章:

python - 将文本与模板进行比较以检测异常(反向模板)

c++ - 使用类似模板的机制调用具有相同签名的不同方法

ruby-on-rails - 初始化会破坏rails中的布局设置吗?

c++ - C++ 中采用引用的 Void 函数与返回值的函数

c++ - 当我为我的简单类数组重载赋值运算符时,我得到了我期望的错误答案

c++ - 使用自定义类集时出错

c++ - 强制先尝试一个过载,然后再返回另一个

c++ - 初始化作为另一个结构成员的结构 - ISO C++

c++ - 如何授予对私有(private)方法的访问权限

c++ - 声明会影响 std 命名空间吗?