@@ -806,7 +806,9 @@ public:
806806 }
807807# endif // _LIBCPP_CXX03_LANG
808808 _LIBCPP_HIDE_FROM_ABI iterator insert_after (const_iterator __p, const value_type& __v);
809- _LIBCPP_HIDE_FROM_ABI iterator insert_after (const_iterator __p, size_type __n, const value_type& __v);
809+ _LIBCPP_HIDE_FROM_ABI iterator insert_after (const_iterator __p, size_type __n, const value_type& __v) {
810+ return __insert_after (__p, __n, __v);
811+ }
810812 template <class _InputIterator , __enable_if_t <__has_input_iterator_category<_InputIterator>::value, int > = 0 >
811813 _LIBCPP_HIDE_FROM_ABI iterator insert_after (const_iterator __p, _InputIterator __f, _InputIterator __l);
812814
@@ -876,6 +878,9 @@ private:
876878 template <class _Iter , class _Sent >
877879 _LIBCPP_HIDE_FROM_ABI void __assign_with_sentinel (_Iter __f, _Sent __l);
878880
881+ template <class ... _Args>
882+ _LIBCPP_HIDE_FROM_ABI iterator __insert_after (const_iterator __p, size_type __n, _Args&&... __args);
883+
879884 template <class _Compare >
880885 static _LIBCPP_HIDE_FROM_ABI __node_pointer __merge (__node_pointer __f1, __node_pointer __f2, _Compare& __comp);
881886
@@ -1129,17 +1134,18 @@ forward_list<_Tp, _Alloc>::insert_after(const_iterator __p, const value_type& __
11291134}
11301135
11311136template <class _Tp , class _Alloc >
1137+ template <class ... _Args>
11321138typename forward_list<_Tp, _Alloc>::iterator
1133- forward_list<_Tp, _Alloc>::insert_after (const_iterator __p, size_type __n, const value_type& __v ) {
1139+ forward_list<_Tp, _Alloc>::__insert_after (const_iterator __p, size_type __n, _Args&&... __args ) {
11341140 __begin_node_pointer __r = __p.__get_begin ();
11351141 if (__n > 0 ) {
1136- __node_pointer __first = this ->__create_node (/* next = */ nullptr , __v );
1142+ __node_pointer __first = this ->__create_node (/* next = */ nullptr , std::forward<_Args>(__args)... );
11371143 __node_pointer __last = __first;
11381144# if _LIBCPP_HAS_EXCEPTIONS
11391145 try {
11401146# endif // _LIBCPP_HAS_EXCEPTIONS
11411147 for (--__n; __n != 0 ; --__n, __last = __last->__next_ ) {
1142- __last->__next_ = this ->__create_node (/* next = */ nullptr , __v );
1148+ __last->__next_ = this ->__create_node (/* next = */ nullptr , std::forward<_Args>(__args)... );
11431149 }
11441150# if _LIBCPP_HAS_EXCEPTIONS
11451151 } catch (...) {
@@ -1239,33 +1245,8 @@ void forward_list<_Tp, _Alloc>::resize(size_type __n) {
12391245 ;
12401246 if (__i != __e)
12411247 erase_after (__p, __e);
1242- else {
1243- __n -= __sz;
1244- __begin_node_pointer __r = __p.__get_begin ();
1245- if (__n > 0 ) {
1246- __node_pointer __first = this ->__create_node (/* next = */ nullptr );
1247- __node_pointer __last = __first;
1248- # if _LIBCPP_HAS_EXCEPTIONS
1249- try {
1250- # endif // _LIBCPP_HAS_EXCEPTIONS
1251- for (--__n; __n != 0 ; --__n, __last = __last->__next_ ) {
1252- __last->__next_ = this ->__create_node (/* next = */ nullptr );
1253- }
1254- # if _LIBCPP_HAS_EXCEPTIONS
1255- } catch (...) {
1256- while (__first != nullptr ) {
1257- __node_pointer __next = __first->__next_ ;
1258- this ->__delete_node (__first);
1259- __first = __next;
1260- }
1261- throw ;
1262- }
1263- # endif // _LIBCPP_HAS_EXCEPTIONS
1264- __last->__next_ = __r->__next_ ;
1265- __r->__next_ = __first;
1266- __r = static_cast <__begin_node_pointer>(__last);
1267- }
1268- }
1248+ else
1249+ __insert_after (__p, __n - __sz);
12691250}
12701251
12711252template <class _Tp , class _Alloc >
@@ -1278,9 +1259,8 @@ void forward_list<_Tp, _Alloc>::resize(size_type __n, const value_type& __v) {
12781259 ;
12791260 if (__i != __e)
12801261 erase_after (__p, __e);
1281- else {
1282- insert_after (__p, __n - __sz, __v);
1283- }
1262+ else
1263+ __insert_after (__p, __n - __sz, __v);
12841264}
12851265
12861266template <class _Tp , class _Alloc >
0 commit comments