/// @brief uninitialized_copy 的非 trivial 版本 template <classInputIterator, classForwardIterator> ForwardIterator __uninitialized_copy(InputIterator first, InputIterator last, ForwardIterator result, std::false_type) { auto cur = result; try { for (; first != last; ++first, ++cur) { // 移动构造 tinystl::construct(&*cur, *first); } } // commit or rollback,要么产生出所有的元素,要么一个都不产生 // catch(...) 会捕获所有异常 catch(...) { for (; result != cur; ++result) { // 析构 tinystl::destroy(&*result); } } return cur; }
/// @brief 把 [first, last) 上的内容复制到以 result 为起始处的空间,返回复制结束的位置 template <classInputIterator, classForwardIteraotr> ForwardIteraotr uninitialized_copy(InputIterator first, InputIterator last, ForwardIteraotr result){ // 判断是否为 POD 类型,这里使用了 std::is_trivially_copy_assignable return tinystl::__uninitialized_copy(first, last, result, std::is_trivially_copy_assignable<typename iterator_traits<InputIterator>::value_type>{}); // MyTinySTL 中这里判断的是 ForwardIterator 的 value_type,感觉有点问题 }
POD 意指 Plain Old Data,也就是标量型别 (scalar types) 或传统的 C struct 型别。POD 型别必然拥有 trivial ctor/dtor/copy/assignment 函数,因此、我们可以对 POD 型别采用最有效率的初值填写手法,而对 non-POD 型别采取最保险安全的做法。