【发布时间】:2015-12-22 00:04:37
【问题描述】:
一个“奇异迭代器”是defined as an:
不与任何序列关联的迭代器。空指针以及默认构造的指针(保存不确定值)都是单数
我的问题 1 是:默认构造的迭代器是否被视为“单一迭代器”?
其次,我一直told here那个:
大多数表达式的结果对于奇异值是未定义的;唯一的例外是销毁包含奇异值的迭代器,将非奇异值分配给包含奇异值的迭代器,并且对于满足 DefaultConstructible 要求的迭代器,使用值初始化的迭代器作为复制或移动操作。
问题 2 是:使用“未定义”的结果是否构成未定义行为? 如果这是真的,这将是未定义行为:
void* foo = nullptr;
auto bar = foo;
但是it runs fine。
我提出这个问题的更深层动机是在我有这样一个结构的情况下:
struct Foo {
vector<int*>::const_iterator;
};
我想知道这样做是否是未定义的行为,其中assigned 是构造的值Foo 对象:
Foo unasigned;
assigned = unassigned;
如果问题 1 和 2 的答案是“是”,那么通过调用默认赋值运算符,我将引入未定义的行为 :(
【问题讨论】:
-
只是一个旁注:这不是因为它在某处运行良好,这不是 UB
-
“默认构造的迭代器”是什么意思?
-
您应该包含您实际询问的代码,而不是做出模糊的陈述。
-
@HappyCoder
vector<int*>::const_iterator foo;是我所说的“默认构造的迭代器”。 -
该段对迭代器提出了一般要求——即,它们不需要支持超出指定值的奇异值的操作。具体的迭代器类型(例如指针)可以提供额外的保证。对于
vector<int*>::const_iterator,它是一种实现定义的类型,您不能假设它的功能超出了标准的要求。
标签: c++ iterator assignment-operator default-constructor singular