std::forwarded_list В чём разница между emplace_after и insert_after
я изучаю стандартную библиотеку шаблонов C++ - STL. В std::forwarded_list и в некоторых иных контейнерах имеются методы emplace_after() и insert_after(). Я не совсем понимаю, в чём их основная разница. По имеющейся у меня информации, они оба добавляют объект/значение на место после указанного. Но разумеется, это не единственная причина существования таких функций.
Уточнено: Требуется имплементация обеих методов. Чтобы был наглядный пример, как они работают из под вуали.
Буду благодарен, если поможете в моем нелёгком пути новичка!
Ответы (1 шт):
В Visual C++ реализовано так:
iterator insert_after(const_iterator _Where, _Ty&& _Val) { // insert _Val after _Where
return emplace_after(_Where, _STD move(_Val));
}
template <class... _Valty>
iterator emplace_after(const_iterator _Where, _Valty&&... _Val) { // insert element after _Where
_Insert_after(_Where._Ptr, _STD forward<_Valty>(_Val)...);
return _Make_iter(_Where._Ptr->_Next);
}
template <class... _Valty>
void _Insert_after(_Nodeptr _Pnode, _Valty&&... _Val) { // insert element after _Where
_Alloc_construct_ptr<_Alnode> _Newnode(_Getal());
_Newnode._Allocate(); // throws
_Alnode_traits::construct(
_Newnode._Al, _STD addressof(_Newnode._Ptr->_Myval), _STD forward<_Valty>(_Val)...); // throws
_Construct_in_place(_Newnode._Ptr->_Next, _Pnode->_Next);
_Pnode->_Next = _Newnode._Release();
}
template <class _Ty, class... _Types>
_CONSTEXPR20_DYNALLOC void _Construct_in_place(_Ty& _Obj, _Types&&... _Args) noexcept(
is_nothrow_constructible_v<_Ty, _Types...>) {
{
::new (_Voidify_iter(_STD addressof(_Obj))) _Ty(_STD forward<_Types>(_Args)...);
}
}
Т.е. просто вызывается конструктор по месту (placement new).
Но не гарантия, что другой компилятор поступит так же. Не оговорена в стандарте "имплементация".