fsc*_*enm 2 c++ visual-studio-2010
我有一个问题,为初始化的迭代器分配一个未初始化.使用Visual Studio 2010构建时,以下代码摘录会产生访问冲突.在以前版本的Visual Studio中,代码应该可以正常工作.
#include <list>
int main() {
std::list<int> list;
std::list<int>::iterator it = list.begin();
std::list<int>::iterator jt;
it = jt; // crashes in VS 2010
}
Run Code Online (Sandbox Code Playgroud)
这不会被视为有效的C++吗?
我需要这段代码来实现一个"游标"类,它既可以指向任何地方,也可以指向列表中的特定元素.如果我没有对容器的引用,我还可以将其用作未初始化迭代器的值?
it = jt; // crashes in VS 2010
Run Code Online (Sandbox Code Playgroud)
这会调用未定义的行为(UB).根据C++标准,jt是一个单独的迭代器,它与任何容器都没有关联,并且大多数表达式的结果都是未定义的奇异迭代器.
C++标准(2003)第24.1/5节中的内容(具体见粗体文字),
正如指向数组的常规指针一样,它保证指针值指向数组的最后一个元素,因此对于任何迭代器类型,都有一个迭代器值指向相应容器的最后一个元素.这些值称为past-the-end值.定义表达式*i的迭代器i的值称为可解除引用.库从不假设过去的值是可解除引用的.迭代器也可以具有与任何容器无关的奇异值. [示例:在声明未初始化的指针x(与int*x;一样)之后,必须始终假定x具有指针的奇异值.] 对于奇异值,大多数表达式的结果是未定义的.唯一的例外是将非奇异值赋给包含奇异值的迭代器.在这种情况下,奇异值将以与任何其他值相同的方式被覆盖.可解除引用的值总是非奇异的.
如果MSVS2010崩溃了,它是UB的无限可能之一,因为UB意味着任何事情都可能发生; 标准没有规定任何行为.