std::forwarded_list В чём разница между emplace_after и insert_after

я изучаю стандартную библиотеку шаблонов C++ - STL. В std::forwarded_list и в некоторых иных контейнерах имеются методы emplace_after() и insert_after(). Я не совсем понимаю, в чём их основная разница. По имеющейся у меня информации, они оба добавляют объект/значение на место после указанного. Но разумеется, это не единственная причина существования таких функций.

Уточнено: Требуется имплементация обеих методов. Чтобы был наглядный пример, как они работают из под вуали.

Буду благодарен, если поможете в моем нелёгком пути новичка!


Ответы (1 шт):

Автор решения: Mikhailo

В 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).

Но не гарантия, что другой компилятор поступит так же. Не оговорена в стандарте "имплементация".

→ Ссылка