“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 的答案为“是”,那么通过调用默认赋值运算符,我将引入未定义的行为:(
答案 0 :(得分:0)
问题2是:使用“未定义”的结果是否构成未定义的行为?
答案是:肯定是的。在UB工作是UB。
它似乎运行正常,因为它是未定义的。它可以做任何事情,包括按预期工作,以及不按预期工作。
答案 1 :(得分:0)
关于第二个问题的示例,它工作正常,因为并且是明确定义的,因为您实际上没有取消引用指针foo
。变量foo
已初始化,您所做的只是使用另一个初始化变量初始化变量。它与例如没有什么不同。
int foo = 0;
auto bar = foo;
但是,如果你这样做了。
int* foo = nullptr;
auto bar = *foo;
将是UB,因为您取消引用空指针。
此外,未定义的行为是,未定义的...它可能似乎运行良好,但实际上它确实不是。