Está destinado a facilitar el uso de este tipo de iteradores, tanto para los algoritmos estándar como para los usuarios de los clientes.
Por ejemplo (recordemos que RandomAccessIterator
es un subtipo de ForwardIterator
):
template <class RandomAccessIterator>
void sort (RandomAccessIterator first, RandomAccessIterator last)
{
RandomAccessIterator pivot, i, j;
//do your sorting algorithm
}
Si no se construible por defecto que se necesita para asignarlos a first
o last
sólo para que se compile.
No necesita que se establezca en un valor predeterminado. Cualquier uso de dicho iterador no inicializado no está definido. No es que no sería prudente agregar algo de control, particularmente en compilaciones de depuración.
Y no, no debe arrojar el constructor predeterminado. Sería técnicamente conforme, pero muchos algoritmos fallarán inesperadamente.
No importa si hay una razón real para ello; es necesario*. Entonces ignore el requisito bajo su propio riesgo. –
Bueno, si el iterador se basa lógicamente en un argumento, la alternativa es agregar constructores predeterminados que dejen el objeto en un estado no válido, lo que también parece flirtear con el peligro. – Ayjay
Una alternativa * working * sería cambiar sus iteradores para que no se basen en un argumento. Póngalos en un estado válido pero conceptualmente vacío. –