デフォルトで a を構築するための要件を示す標準アルゴリズムを見つけることができないようですForwardIterator
。
それには実際の理由がありますか、それとも無視しても安全ですか?
標準アルゴリズムとクライアント ユーザーの両方にとって、この種の反復子の使用を容易にするためにあります。
RandomAccessIterator
例 (は のサブタイプであることを思い出してForwardIterator
ください):
template <class RandomAccessIterator>
void sort ( RandomAccessIterator first, RandomAccessIterator last )
{
RandomAccessIterator pivot, i, j;
//do your sorting algorithm
}
それらがデフォルトで構築可能でない場合は、それらをコンパイルするために割り当てるfirst
か、last
単にコンパイルする必要があります。
デフォルト値に設定する必要はありません。このような初期化されていない反復子の使用は未定義です。特にデバッグビルドでは、チェックを追加するのは賢明ではないということではありません。
いいえ、デフォルトのコンストラクターをスローしないでください。技術的には適合しますが、多くのアルゴリズムは予期せず失敗します。
ドラフトの私のコピーから:
24.2.5 前方反復子 [forward.iterator]
1クラスまたは組み込み型 X は、次の場合に順方向反復子の要件を満たします。
[...]
— X は DefaultConstructible 要件 (20.2.1) を満たします。
その後:
20.2.1 テンプレート引数の要件
2一般に、デフォルトのコンストラクターは必要ありません。特定のコンテナー クラス メンバー関数シグネチャは、既定のコンストラクターを既定の引数として指定します。これらの署名の 1 つがデフォルトの引数 (8.3.6) を使用して呼び出される場合、T() は明確に定義された式 (8.5) になります。
ここで注意すべき点が 2 つあります。