«Единственный итератор» определяется как ап:
итераторы, которые не связаны ни с одной последовательностью. Нулевой указатель, а также созданный по умолчанию указатель (содержащий неопределенное значение) является единственным
Мой вопрос 1 было бы: Считается ли созданный по умолчанию итератор «Сингулярным итератором»?
Во-вторых, я был сказал здесь тот:
Результаты большинства выражений не определены для единичных значений; единственными исключениями являются уничтожение итератора, который содержит единственное значение, присвоение не единственного значения итератору, который содержит единственное значение, и для итераторов, которые удовлетворяют требованиям DefaultConstructible, использование инициализатора, инициализированного значением, в качестве источника операция копирования или перемещения.
Вопрос 2 является: Является ли работа с «неопределенным» результатом неопределенным поведением? Казалось бы, если бы это было правдой, это было бы неопределенным поведением:
void* foo = nullptr;
auto bar = foo;
Моя более глубокая мотивация для того, чтобы задать этот вопрос, в том случае, когда у меня есть такая структура:
struct Foo {
vector<int*>::const_iterator;
};
Я хочу знать, если это неопределенное поведение, чтобы сделать это, где assigned
это значение построено Foo
объект:
Foo unasigned;
assigned = unassigned;
Если ответы на вопросы 1 а также 2 Если да, то, вызывая оператор присваивания по умолчанию, я ввожу неопределенное поведение 🙁
Вопрос 2: является ли работа с «неопределенным» результатом неопределенным поведением?
Ответ: определенно да. Работа на UB — это UB.
Кажется, он работает нормально, так как он не определен. Он может делать все что угодно, в том числе работать как положено, так и не так, как ожидалось.
Что касается примера для второго вопроса, он работает нормально, потому что он четко определен, потому что вы на самом деле не разыменовываете указатель foo
, Переменная foo
инициализируется, все, что вы делаете, это инициализируете переменную с другой инициализированной переменной. Это ничем не отличается от, например,
int foo = 0;
auto bar = foo;
Однако, если вы сделали, например,
int* foo = nullptr;
auto bar = *foo;
тот будет UB, потому что вы разыменовываете нулевой указатель.
Кроме того, неопределенное поведение, ну, в общем, неопределенное … казаться бежать нормально, но на самом деле это не так.