我正在尝试写一个列表。我使用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
操作中停止了。
是什么导致此问题?
我应该使用重载来处理左值和右值情况吗?
答案 0 :(得分:1)
您的List
构造函数不会初始化您在trailer
中使用的insertAsLast
成员,这会导致未定义的行为,从而导致崩溃。