奇异迭代器的分配

时间:2015-09-24 11:42:44

标签: c++ iterator assignment-operator default-constructor singular

“Singular Iterator”是defined as an:

  

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

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

其次,我一直told here

  

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

问题 2 是:使用“未定义”的结果是否构成未定义的行为?如果这是真的,那么这将是未定义的行为:< / p>

void* foo = nullptr;
auto bar = foo;

但是it runs fine

我提出这个问题的深层动机是我有这样的结构:

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

我想知道这是否是未定义的行为,其中assigned是一个值构造Foo对象:

Foo unasigned;

assigned = unassigned;

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

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

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

int foo = 0;
auto bar = foo;

但是,如果你这样做了。

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

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

此外,未定义的行为是,未定义的...它可能似乎运行良好,但实际上它确实不是。