(下手な英語でごめんなさい!) こんにちは、私は産業用コンピューティングを勉強しています。これは私の5期目です。私のコースの 1 つで、先生はクラス 'List' (前方のみ、次の要素への ptr であり、前の要素への ptr ではない) を 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;
}
}
また、何もコピーしない ( return void ) nothrow_t パラメータを使用してメソッド extract を作成したので、抽出を「強制」できます。stl がこれを行わないのはなぜですか? 「auto v = something.pop();」とすればいいです。! 私のバージョンは安全ですか? コピー コンストラクターでスローされる可能性のある例外が本当に気になり、続行してデータを保持したい場合は、単純に 'pop' メソッドをキャッチできませんか?
助けてくれてありがとう!