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

«Единственный итератор» определяется как ап:

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

Мой вопрос 1 было бы: Считается ли созданный по умолчанию итератор «Сингулярным итератором»?

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

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

Вопрос 2 является: Является ли работа с «неопределенным» результатом неопределенным поведением? Казалось бы, если бы это было правдой, это было бы неопределенным поведением:

void* foo = nullptr;
auto bar = foo;

Но работает нормально.


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

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

Я хочу знать, если это неопределенное поведение, чтобы сделать это, где assigned это значение построено Foo объект:

Foo unasigned;

assigned = unassigned;

Если ответы на вопросы 1 а также 2 Если да, то, вызывая оператор присваивания по умолчанию, я ввожу неопределенное поведение 🙁

1

Решение

Вопрос 2: является ли работа с «неопределенным» результатом неопределенным поведением?

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

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

0

Другие решения

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

int foo = 0;
auto bar = foo;

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

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

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

Кроме того, неопределенное поведение, ну, в общем, неопределенное … казаться бежать нормально, но на самом деле это не так.

0

По вопросам рекламы [email protected]