C++临时变量是否会在语句结束时释放?是否属于标准规定?
问题解答
你观察到的执行结果完全符合C++标准的强制规定,临时对象默认在创建它的完整语句(完整表达式)结束时释放是通用规则。
具体规则说明
- C++标准中定义:除了引用生命周期延长、返回值优化等少数特殊场景外,所有临时对象的生命周期都会持续到创建它的完整表达式(full-expression) 求值完全结束。
你代码中main函数里由逗号运算符、逻辑与运算符连接的那整条语句,就是一个独立的完整表达式,你创建的C类临时实例属于这个表达式内的临时对象,自然要等整个表达式的所有操作(两次kkk2调用、两次printf调用、逻辑与运算)全部执行完成后,才会调用析构函数释放。 - 你原本预期
kkk调用结束就释放临时对象,属于对函数参数绑定规则的误解:绑定到函数调用实参的临时对象,生命周期不会在函数返回时立刻结束,而是会延长到包含该函数调用的完整表达式结束,刚好匹配你测试的场景表现。
规则验证
你可以将kkk(C());单独作为一行语句执行,此时该语句本身就是一个完整表达式,输出会变为:
C O kkk C D
完全符合“完整表达式结束释放临时对象”的规则。
你测试的g++、clang++、msvc++输出完全一致,正是因为这是标准强制要求的通用行为,不属于编译器自定义实现。
内容的提问来源于stack exchange,提问作者untitled
相关产品推荐
相关产品推荐

