Сравнение построенных по умолчанию итераторов с оператором ==
Говорит ли стандарт С++, что я могу сравнить два итератора STL, построенных по умолчанию, для равенства? По умолчанию построены итераторы, сопоставимые по соотношению?
Я хочу следующее, используя std:: list, например:
void foo(const std::list<int>::iterator iter) {
if (iter == std::list<int>::iterator()) {
// Something
}
}
std::list<int>::iterator i;
foo(i);
Я хочу здесь что-то вроде значения NULL для итераторов, но я не уверен, что это законно. В реализации STL, включенной в Visual Studio 2008, они включают утверждения в std:: list operator ==(), которые исключают это использование. (Они проверяют, что каждый итератор "принадлежит" одним и тем же контейнером, и итераторы, построенные по умолчанию, не имеют контейнера.) Это намекает на то, что оно не является законным или, возможно, что они чрезмерно усердны.
Ответы
Ответ 1
Хорошо, я сделаю удар. Стандарт С++, раздел 24.1/5:
Итераторы также могут иметь сингулярные значения, которые не связаны с любой контейнер. [Пример: после декларация неинициализированной указатель x (как и для int * x;), x должен всегда предполагается, что имеет единственное значение указателя. ] Результаты большинства выражения undefined для сингулярных значения; единственным исключением является присвоение неособых значений итератор, содержащий единственное значение.
Итак, нет, их нельзя сравнивать.
Ответ 2
Это изменится в С++ 14. [forward.iterators] 24.2.5p2 из N3936 говорит
Однако инициализированные инициализацией итераторы могут сравниваться и сравнивать равный другим итераторам с инициализацией значения того же типа.
Ответ 3
Я считаю, что вы должны передать диапазон в функцию.
void fun(std::list<int>::iterator beg, std::list<int>::iterator end)
{
while(beg != end)
{
// do what you want here.
beg++;
}
}
Ответ 4
В спецификации указано, что постусловие конструктора по умолчанию состоит в том, что итератор особый. Сравнение для равенства undefined, поэтому в некоторой реализации оно может быть различным.