Я пытаюсь написать список.И я использовал forwarding reference
для обработки lvalue
и rvalue
.Но программа работает неправильно при вызове оператора new
в функции insertAsPrev
.
template <typename T>
class ListNode
{
friend class List<T>;
public:
using pnode = ListNode<T> *;
ListNode() : prev(nullptr), next(nullptr) {}
ListNode(T const & e, pnode p=nullptr, pnode n=nullptr)
: data(e), prev(p), next(n) {}
template <typename X>
ListNode(X && e, pnode p=nullptr, pnode n=nullptr)
: data(std::forward<X>(e)), prev(p), next(n) { cout << "ini\n";}
template <typename X>
pnode insertAsPrev(X && e);
template <typename X>
pnode insertAsNext(X && e);
private:
T data;
pnode prev;
pnode next;
};
template <typename T>
template <typename X>
ListNode<T> * ListNode<T>::insertAsPrev(X && e)
{
cout << "insert as prev\n";
pnode node = new ListNode<T>(std::forward<X>(e), prev, this);
prev->next = node; prev = node;
return node;
}
template <typename T>
List<T>::List(initializer_list<T> il)
{
for (T i : il)
{
cout << "initializer list\n" ;
insertAsLast(i);
}
}
template <typename T>
template <typename X>
ListNode<T> * List<T>::insertAsLast(X && e)
{
cout << "as last\n";
++_size; return trailer->insertAsPrev(std::forward<X>(e));
}
int main()
{
List<int> = {1, 2, 3, 4, 2, 3, 1};
}
Вывод:
initializer list
as last
insert as prev
The terminal process terminated with exit code: 2816
Мой вопрос:
Кажется, что программа остановилась в операции new
.
Что вызывает эту проблему?
Должен ли я использовать перегрузку для обработки ситуации lvalue и rvalue?