2

“单一迭代器”定义为

不与任何序列关联的迭代器。空指针以及默认构造的指针(保存不确定值)是单数

我的问题1是:默认构造的迭代器是否被视为“单一迭代器”?

其次,我在这里被告知

大多数表达式的结果对于奇异值是未定义的;唯一的例外是销毁包含奇异值的迭代器,将非奇异值分配给包含奇异值的迭代器,并且对于满足 DefaultConstructible 要求的迭代器,使用值初始化的迭代器作为复制或移动操作。

问题2是:使用“未定义”的结果是否构成未定义行为?如果这是真的,这似乎是未定义的行为:

void* foo = nullptr;
auto bar = foo;

它运行良好


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

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

我想知道这样做是否是未定义的行为,assigned值构造Foo对象在哪里:

Foo unasigned;

assigned = unassigned;

如果问题12的答案是“是”,那么通过调用默认赋值运算符,我将引入未定义的行为 :(

4

2 回答 2

0

问题 2 是:使用“未定义”的结果是否构成未定义行为?

答案是:肯定是的。在 UB 上工作就是 UB。

它似乎对您来说运行良好,因为它是未定义的。它可以做任何事情,这包括按预期工作,以及按预期工作。

于 2015-09-24T11:46:22.047 回答
0

关于第二个问题的示例,它可以正常工作,因为并且定义明确,因为您实际上并没有取消引用指针foo。变量foo已初始化,您所做的只是用另一个已初始化的变量初始化一个变量。它与例如没有什么不同

int foo = 0;
auto bar = foo;

但是,如果你这样做了

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

将是 UB,因为您取消引用空指针。

此外,未定义的行为是,嗯,未定义的......它可能看起来运行良好,但实际上并非如此。

于 2015-09-24T11:47:02.247 回答