奇异迭代器的赋值
Assignment of a Singular Iterator
"Singular Iterator"定义为:
不与任何序列关联的迭代器。空指针和默认构造的指针(保存一个不确定的值)都是单数
我的问题1是:默认构造的迭代器被认为是"奇异迭代器"吗?
其次,有人告诉我:
对于奇异值,大多数表达式的结果是未定义的;唯一的例外是:销毁保存奇异值的迭代器,将非奇异值赋值给保存奇异值的迭代器,以及对于满足DefaultConstructible要求的迭代器,使用值初始化的迭代器作为复制或移动操作的源。
问题2是:处理"未定义"的结果是否构成未定义行为?如果这是真的,这将是未定义行为:
void* foo = nullptr;
auto bar = foo;
但是它运行得很好。
我问这个问题的更深层次的动机是在我有这样一个结构体的情况下:
struct Foo {
vector<int*>::const_iterator;
};
我想知道这样做是否是未定义的行为,其中assigned
是Foo
对象的值构造:
Foo unasigned;
assigned = unassigned;
如果问题1和2的答案是"是",那么通过调用默认赋值操作符,我引入了未定义的行为:(
问题2是:处理"未定义"的结果是否构成未定义行为?
答案是:绝对是。工作在UB就是UB。
它似乎运行良好,因为它是未定义的。它可以做任何事情,包括按预期工作,也可以不按预期工作。
关于第二个问题的例子,它工作得很好,因为并且定义良好,因为您实际上没有取消对指针foo
的引用。变量foo
被初始化,您所做的就是用另一个初始化的变量初始化一个变量。
int foo = 0;
auto bar = foo;
然而,如果你做了例如
int* foo = nullptr;
auto bar = *foo;
将是UB,因为您解引用了空指针。
另外,未定义的行为是,嗯,未定义的…看起来运行得很好,但实际上并非如此。
相关文章:
- 为什么以及如何C++更改旧迭代器的值
- 使用一个 for 循环如何迭代和测试迭代器值?
- 如何为指向复杂值的迭代器专门化算法?
- C++值初始化矢量迭代器比较
- 专门C++使用指针值类型的通用迭代器的模板函数?
- 调用 erase() 函数是否也会在擦除元素之前更改迭代器值?
- 创建可以遍历 std::map 值的通用模板迭代器的最简单方法是什么?
- 从矢量不需要的值进行迭代器打印
- 输入迭代器是否可以仅在赋值的右侧符号上取消引用?
- 迭代器和简单的赋值/析构函数
- 如何让迭代器使用赋值运算符对列表进行操作
- 通过迭代器为映射的成员赋值
- 为什么转发迭代器没有加法赋值运算符?
- 赋值(运算符 =)使容器的迭代器失效
- STL SET 迭代器赋值 没有可行的候选者
- 向量迭代器在赋值重载中不兼容
- 使用boost multiarray迭代器在数组元素之间进行赋值
- 奇异迭代器的赋值
- 用于超大型对象的方便的基于指针数组的值迭代器
- c++编程:将迭代器赋值给vector时出错