Сравнение построенных по умолчанию итераторов с оператором ==

Говорит ли стандарт С++, что я могу сравнить два итератора 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, поэтому в некоторой реализации оно может быть различным.