1

(下手な英語でごめんなさい!) こんにちは、私は産業用コンピューティングを勉強しています。これは私の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' メソッドをキャッチできませんか?

助けてくれてありがとう!

4

2 に答える 2