(对不起我的英语不好!)你好,我正在学习工业计算。这是我的第五个任期。在我的一门课程中,老师要求我们在 c 中编写一个类“列表”(仅转发,指向下一个元素但不是前一个元素)。我已经完成了一个简单的“提取”方法,它返回一个 value_type 并删除第一个元素,但我的老师说,如果复制构造函数抛出异常,该值将丢失,因为它已被提取。我查看了 std::forward_list 并且我看到 stl 提供了一种提取方法和一种访问最后一个元素的方法( pop_front() 和 front() )。我不明白为什么我们不能用一种方法来做到这一点?我写了这段代码:
value_type extract()
{
if( empty() )
throw EmptyList();
std::unique_ptr< Node > p = m_Head;
if( m_Head == m_Last )
m_Last = nullptr;
m_Head = m_Head->m_Next;
try
{
return p->m_Value;
}
catch( ... )
{
m_Head = p.release();
if( !m_Last )
m_Last = m_Head;
throw;
}
}
我还制作了一个带有 nothrow_t 参数的方法提取,该参数不复制任何内容( return void ),因此我们可以“强制”提取。为什么 stl 不这样做?做“auto v = something.pop();”会很好 !我的版本安全吗?如果我们真的关心可以在复制构造函数中抛出的异常并且我们真的想继续并保留数据,我们不能简单地尝试围绕“pop”方法进行捕获吗?
谢谢你的帮助!