我有这个简单的 qmake C++ 项目: .pro 文件:
CONFIG += c++17
QMAKE_CXXFLAGS += -O0 -ggdb3
target.path = /tmp/$${TARGET}/dev
INSTALLS += target
SOURCES += main.cpp
main.cpp 文件:
#include <chrono>
#include <iostream>
using Seconds = std::chrono::duration<int, std::ratio<1, 1>>;
struct TimeSpan
{
Seconds seconds;
};
TimeSpan operator + (TimeSpan left, TimeSpan right) { return { left.seconds + right.seconds }; }
int main()
{
TimeSpan a = { Seconds(1) };
TimeSpan b = { Seconds(2) };
TimeSpan ab = a + b;
auto as = a.seconds;
auto bs = b.seconds;
auto abs = as + bs;
std::cout << a.seconds.count()
<< " + " << b.seconds.count()
<< " = " << ab.seconds.count()
<< " = " << (a + b).seconds.count() << std::endl;
std::cout << as.count()
<< " + " << bs.count()
<< " = " << abs.count()
<< " = " << (as + bs).count() << std::endl;
return 0;
}
程序正确打印
1 + 2 = 3 = 3
1 + 2 = 3 = 3
但是当我在
return 0;
上放置断点并查看表达式评估器时,事情变得疯狂:a + b
并且它根本不能做as + bs
。有趣的是,做任何刷新调试器的事情(例如单步执行、修改求值器、更改显示格式等)都会导致值发生变化:怎么回事?该程序非常简单。调试器真的会在如此简单的评估中出错吗?我该怎么做才能让它正常运行?
我正在使用 Qt Creator 5.0.2
该问题在多个目标架构(x86 和 ARM)上仍然存在,但错误值不同。