先做出预测
揭晓后,可用“下一步”沿着对象生命周期前进。
C++ 对象语义 · 交互实验室
先预测会选中哪个操作,再逐步执行代码。你会同时看到表达式的值类别、对象状态和析构顺序——重点不在背调用次数,而在判断“新对象还是已有对象”以及“资源责任是否发生转交”。
对象状态
揭晓后,可用“下一步”沿着对象生命周期前进。
T b = a; 中的等号属于初始化;b = a; 才是对已有对象赋值。先看左侧对象是否已经存在。
std::move(x) 只产生可供移动重载匹配的 xvalue。真正是否转交状态,由随后选中的操作决定。
被移动对象仍然有效、仍会析构,也可以重新赋值;除非类型另有承诺,不要依赖其具体内容。
关于输出次数:这里的轨迹刻意选择直接调用特殊成员的语句来讲清语义。实际程序中的按值返回、纯右值初始化等路径可能发生强制或可选的复制省略,某次编译打印出的调用次数不能当成所有环境的普遍保证。若代码违反生命周期或所有权规则,应关注违规关系及 sanitizer 诊断,不推断未定义行为下的偶然输出。