10

デフォルトで a を構築するための要件を示す標準アルゴリズムを見つけることができないようですForwardIterator

それには実際の理由がありますか、それとも無視しても安全ですか?

4

2 に答える 2

5

標準アルゴリズムとクライアント ユーザーの両方にとって、この種の反復子の使用を容易にするためにあります。

RandomAccessIterator例 (は のサブタイプであることを思い出してForwardIteratorください):

template <class RandomAccessIterator>
  void sort ( RandomAccessIterator first, RandomAccessIterator last )
{
    RandomAccessIterator pivot, i, j;
    //do your sorting algorithm        
}

それらがデフォルトで構築可能でない場合は、それらをコンパイルするために割り当てるfirstか、last単にコンパイルする必要があります。

デフォルト値に設定する必要はありません。このような初期化されていない反復子の使用は未定義です。特にデバッグビルドでは、チェックを追加するのは賢明ではないということではありません。

いいえ、デフォルトのコンストラクターをスローしないでください。技術的には適合しますが、多くのアルゴリズムは予期せず失敗します。

于 2012-05-01T10:56:00.337 に答える
3

ドラフトの私のコピーから:

24.2.5 前方反復子 [forward.iterator]

1クラスまたは組み込み型 X は、次の場合に順方向反復子の要件を満たします。

[...]

— X は DefaultConstructible 要件 (20.2.1) を満たします。

その後:

20.2.1 テンプレート引数の要件

2一般に、デフォルトのコンストラクターは必要ありません。特定のコンテナー クラス メンバー関数シグネチャは、既定のコンストラクターを既定の引数として指定します。これらの署名の 1 つがデフォルトの引数 (8.3.6) を使用して呼び出される場合、T() は明確に定義された式 (8.5) になります。

ここで注意すべき点が 2 つあります。

  • 最初の行は、デフォルトのctorがほとんど必要ないことを示しています(これはほとんどあなたの質問に答えています)
  • この要件はおそらく、反復子のセマンティクスがポインターと互換性があるべきであるというヒントであり、後者はデフォルトで構築可能です (既存のコードを壊さないように読み取ります)。
于 2012-05-01T11:21:13.557 に答える