Um intervalo direto r
requer que seu iterador seja, por sua vez, um iterador direto, o que, por sua vez, exige que o iterador funcione como seu próprio sentinela. Mas isso implica que o tipo sentinela real (por exemplo, o tipo retornado por r.end()
) é do mesmo tipo que o próprio iterador ou não?
Não, não importa, mas tem que ser
__WeaklyEqualityComparableWith
(apenas uma exposiçãoconcept
) o tipo de iterador retornado,begin()
como pode ser visto em which é um conceito que ...std::sentinel_for
concept
É utilizado o
sentinel_for
conceitostd::ranges:end()
que pode ser visto em sua assinatura de chamada:Esta nota
sentinel_for
também é de interesse:Nenhum dos conceitos básicos de tipo de intervalo (entrada, encaminhamento, bidirecional, etc.) exige que o sentinela seja um iterador. Até mesmo um
contiguous_range
pode funcionar com um sentinela em vez de um iterador. No entanto, o conceitocommon_range
sim . Portanto, você pode combinar esse conceito com um dos conceitos básicos da linha.Mas você só deve empregar isso quando realmente precisar manipular o sentinela final como um iterador. O que para uma faixa estritamente direta... não é realmente possível. Você não pode desreferenciar isso, pois desreferenciar o iterador final é ruim. Você não pode diminuí-lo, pois é um intervalo direto; seus iteradores não podem voltar atrás.
Basicamente, nunca há uma razão para um modelo que exige um
forward_range
também exigir que seja um arquivocommon_range
.