C++ 无法访问成对向量中的值

C++ 无法访问成对向量中的值,c++,vector,std-pair,C++,Vector,Std Pair,我有一对向量作为物体内部的场。所述对象有一个方法,我需要访问向量中成对的值。我正在使用迭代器指向我希望访问的向量中的位置。以下是包含向量的代码片段: 在头文件中: vector<pair<double, double> > points; vector<pair<double, double> >::iterator headingTo; 在方法上: double x = headingTo->first - positionX; doub

我有一对向量作为物体内部的场。所述对象有一个方法,我需要访问向量中成对的值。我正在使用迭代器指向我希望访问的向量中的位置。以下是包含向量的代码片段:

在头文件中:

vector<pair<double, double> > points;
vector<pair<double, double> >::iterator headingTo;
在方法上:

double x = headingTo->first - positionX;
double y = headingTo->second - positionY;
但是,当我运行此代码时,并没有创建y。当我使用断点查看变量时,它根本没有显示在VisualStudio中。但是,如果我交换各行,y是可访问的,x不是。有什么想法吗

编辑: 我发现了以下工作:

double headingToX = headingTo->first; 
headingToX -= positionX;
double headingToY = headingTo->second;
headingToY-= positionY;

这与优化有关。由于您没有使用分配给的变量,编译器选择不创建它们(本例中是其中一个)。在使用它们的那一刻(在您的工作示例中,您从它们中减去了一个值),编译器就无法再优化它们了


我在其他编译器中看到过这种行为,并且总是通过虚拟使用消失的变量来解决它。

检查您是否正在调试程序的优化版本-在这种情况下,如果编译器可以确定不需要它们来生成程序所需的输出,那么它可以随意删除变量

然而,即使您使用的是未优化的构建,如果您真的根本不使用该变量,这种行为也可能发生。在中,您将看到以下由Microsoft代表发表的评论(重点添加):

这个问题是否只发生在您没有在任何应用程序中使用过的变量上 除了赋值以外的其他方法?变量在 .pdb,通过十六进制编辑器检查,或查看相应的“mov” DISASSEMBLY中的指令不能保证编译器 未执行某种级别的优化,以防止调试器 检查变量(编译器总是进行小优化 甚至在调试构建中)。调试器只能保证访问 如果在中使用变量,则编译器将提供该变量 将应用程序用于除赋值以外的其他目的。

如果您在使用变量的地方有一个repro(而不是 指定了一个值),并且您无法在调试器中检查它,请让 我们知道。否则,这是编译器优化的产物


从您发布的代码中不清楚您以后是否使用了
y

的值。在g++下,代码对我来说运行良好。当你说“y不是被创造的”时,你是什么意思?当您稍后参考
y
时,编译器是否会抱怨没有定义这样的变量?代码看起来正确,因此可能是调试器问题,调试器无法解析第二个pair元素。如果用cout打印值会发生什么?还有,你在第二行之后停止调试器吗?我在第二行之后停止调试器。当我将鼠标悬停在x上时,VS显示它的值,当我将鼠标悬停在y上时,不会发生任何事情。VS还显示了所有局部变量的列表,它不显示y,而是显示x。反之亦然,当y在x之前初始化时。我稍后会使用这两个值,就像我说的,如果我交换x和y,y是可用的,而x不是。@Connel-那么听起来你好像碰到了一个调试器错误。如果你在VS11测试版中尝试了这段代码,但它仍然在那里发生,那么你也许可以让MS来修复它。出于好奇-您使用的是什么版本的VS(出于某种原因,我认为问题中提到了2010,但当我现在看“Visual Studio”时,答案是)。这个项目有多大?这是可以发布到某处的东西吗?我稍后会使用这两个值,就像我说的,如果我交换x和y,y是可用的,x不是。
double headingToX = headingTo->first; 
headingToX -= positionX;
double headingToY = headingTo->second;
headingToY-= positionY;