Назначение сингулярного итератора

"Сингулярный итератор" определяется как an:

которые не связаны ни с какой последовательностью. Нулевой указатель, а также построенный по умолчанию указатель (имеющий неопределенное значение) является сингулярным

Мой вопрос 1: Является ли построенный по умолчанию итератор "сингулярным итератором"?

Во-вторых, я сказал здесь, что:

Результаты большинства выражений undefined для сингулярных значений; единственными исключениями являются уничтожение итератора, который содержит сингулярное значение, назначение несингулярного значения итератору, который содержит сингулярное значение, и для итераторов, удовлетворяющих требованиям DefaultConstructible, с использованием инициализированного значения итератора в качестве источника операции копирования или перемещения.

Вопрос 2: Работает ли результат с undefined "undefined Поведение? Казалось бы, если бы это было так, undefined Поведение:

void* foo = nullptr;
auto bar = foo;

Но он отлично работает.


Моя более глубокая мотивация для запроса этого вопроса в том случае, когда у меня есть такая структура:

struct Foo {
    vector<int*>::const_iterator;
};

Я хочу знать, если это поведение undefined для этого, где assigned - это построенное значение Foo object:

Foo unasigned;

assigned = unassigned;

Если ответы на вопросы 1 и 2 являются "да", то, вызывая оператор присваивания по умолчанию, я представляю поведение undefined:(

Ответ 1

Вопрос 2: Работа с результатом "undefined" составляет Undefined Поведение?

Ответ: Определенно Да. Работа на UB - UB.

Кажется, он работает отлично, потому что это undefined. Он может делать все, что включает в себя работу, как ожидалось, а также работу не так, как ожидалось.

Ответ 2

Что касается примера для второго вопроса, он отлично работает, потому что и хорошо определен, потому что вы фактически не разыскиваете указатель foo. Переменная foo инициализируется, все, что вы делаете, инициализирует переменную с другой инициализированной переменной. Это не отличается от, например,

int foo = 0;
auto bar = foo;

Однако, если вы, например,

int* foo = nullptr;
auto bar = *foo;

который будет UB, потому что вы разыскиваете нулевой указатель.

Кроме того, поведение Undefined, ну, undefined... Казалось бы, оно работает нормально, но на самом деле это действительно не так.