奇异迭代器的赋值

Assignment of a Singular Iterator

本文关键字:赋值 迭代器      更新时间:2023-10-16

"Singular Iterator"定义为:

不与任何序列关联的

迭代器。空指针和默认构造的指针(保存一个不确定的值)都是单数

我的问题1是:默认构造的迭代器被认为是"奇异迭代器"吗?

其次,有人告诉我:

对于奇异值,大多数表达式的结果是未定义的;唯一的例外是:销毁保存奇异值的迭代器,将非奇异值赋值给保存奇异值的迭代器,以及对于满足DefaultConstructible要求的迭代器,使用值初始化的迭代器作为复制或移动操作的源。

问题2是:处理"未定义"的结果是否构成未定义行为?如果这是真的,这将是未定义行为:

void* foo = nullptr;
auto bar = foo;

但是它运行得很好。


我问这个问题的更深层次的动机是在我有这样一个结构体的情况下:

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

我想知道这样做是否是未定义的行为,其中assignedFoo对象的值构造:

Foo unasigned;
assigned = unassigned;

如果问题12的答案是"是",那么通过调用默认赋值操作符,我引入了未定义的行为:(

问题2是:处理"未定义"的结果是否构成未定义行为?

答案是:绝对是。工作在UB就是UB。

它似乎运行良好,因为它是未定义的。它可以做任何事情,包括按预期工作,也可以不按预期工作。

关于第二个问题的例子,它工作得很好,因为并且定义良好,因为您实际上没有取消对指针foo的引用。变量foo被初始化,您所做的就是用另一个初始化的变量初始化一个变量。

int foo = 0;
auto bar = foo;

然而,如果你做了例如

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

将是UB,因为您解引用了空指针。

另外,未定义的行为是,嗯,未定义的…看起来运行得很好,但实际上并非如此。