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