4

C ++ 11規格の23.2.1.10項は、次のように述べています。

「返されたイテレータのコピーコンストラクタは例外をスローしません」

これは基本的に、イテレータのコピーコンストラクタがbad_allocさえもスローしない可能性があることを示していますか(イテレータが単なるポインタであり、ここでは問題がない場合を残します)、「返された」ですでに構築された情報を使用するためです。イテレータ」?値によって渡されるため、スタックは呼び出された関数に割り当てられ、メモリの問題がないことを保証できますか?

4

3 に答える 3

1

その段落は、標準ライブラリのコンテナで使用されるイテレータについて述べています。これらの反復子は、コピー中に例外をスローしないように実装できることが知られています。たとえば、動的に割り当てられたメモリを使用する必要はありません。

保証はこれらのイテレータのみに適用され、一般的なイテレータには適用されません (例に従うのは良い考えですが)。

于 2012-11-17T11:17:29.887 に答える
1

法的回答: いいえ。それはあなたの解釈です。技術的には正しいですが、唯一の技術的に正しい解釈ではないかもしれません。

技術的な回答: ここでのポイントは、変更イテレーター (インサーターまたは出力イテレーターを考えてください) によってスローされた例外が、コンテナーを未定義で一貫性のない状態にしている間にアルゴリズムが放棄されることを回避することです (たとえば、 、リンクがまだ完全に再リンクされていないリンク付きリストへ)

これは、動的に割り当てられた状態を持つイテレータの bad_alloc の問題だけでなく、イテレータ自身のコピー中に、参照されたアイテムを変更しようとして失敗した場合 (たとえば、アイテムの割り当てがスローされるため) の問題でもあります。

そのような場合、イテレータは「アルゴリズムを完成させる」必要はありませんが (それは不可能です)、コンテナを一貫性のある管理可能な状態のままにしておく必要があります。

于 2012-11-17T08:56:57.893 に答える
0

コピー コンストラクターの意味する範囲について誤解があると思います。

コピー コンストラクターは、オブジェクト自体が構築されるメモリを割り当てる責任はありません。これは、呼び出し元によって外部から提供されます。

したがって、要件は、コピー コンストラクターの本体(作成または生成されたもの) がスローしないことです。C++ では、組み込み型 ( intT*、...) をスローせずにコピーできることが知られており、そこから、例外をスローせずにコピー可能な型を構築できます (ただし、動的リソース割り当ておよび/または IO を回避する限り)。自動です)。

于 2012-11-17T15:19:11.917 に答える