C++ 对象语义 · 交互实验室

特殊成员调用与 copy / move 生命周期轨迹

先预测会选中哪个操作,再逐步执行代码。你会同时看到表达式的值类别、对象状态和析构顺序——重点不在背调用次数,而在判断“新对象还是已有对象”以及“资源责任是否发生转交”。

创建新对象 → 构造改写已有对象 → 赋值std::move → 值类别转换移后对象 → 仍要析构

2. 逐步观察

等待预测

对象状态

先做出预测

揭晓后,可用“下一步”沿着对象生命周期前进。

    新对象与已有对象

    T b = a; 中的等号属于初始化;b = a; 才是对已有对象赋值。先看左侧对象是否已经存在。

    转换不是搬运

    std::move(x) 只产生可供移动重载匹配的 xvalue。真正是否转交状态,由随后选中的操作决定。

    移后仍有生命周期

    被移动对象仍然有效、仍会析构,也可以重新赋值;除非类型另有承诺,不要依赖其具体内容。

    关于输出次数:这里的轨迹刻意选择直接调用特殊成员的语句来讲清语义。实际程序中的按值返回、纯右值初始化等路径可能发生强制或可选的复制省略,某次编译打印出的调用次数不能当成所有环境的普遍保证。若代码违反生命周期或所有权规则,应关注违规关系及 sanitizer 诊断,不推断未定义行为下的偶然输出。