重新访问临时对象的生命周期
原始问题中提供的代码片段演示了一种看似矛盾的行为,其中 foo() 返回的临时字符串即使在进入 bar() 时据称已被销毁,它仍然有效。
与假设,当创建临时对象的函数完成时,临时对象并未完全销毁。相反,它的生命周期会延长,直到包含临时值的整个表达式被完全求值。
为了说明这个概念,让我们将代码分解为其组件:
根据 C 语言规则,由 foo().c_str() 生成的 const char* 临时值将持续存在,直到完整表达式 bar(foo().c_str() ) 已完全评估。这意味着即使在 foo() 执行完成后,指针仍然有效。
要可视化此行为,请想象以下时间线:
|--------------------|-----------|-----------|-----------| | | birth | funeral | | | | ^^^ | ^^^^ | | |--------------------| | | | | | bar() | | | | | | | | |--------------------| | | | | | | | evaluated | | | | | bar() | |--------------------| | | | | | | foo() | | | | | | | |--------------------| | | |
临时对象(字符串 out和 const char* 指针)是在计算表达式 foo().c_str() 时创建的,并且它们将持续存在,直到整个表达式 bar(foo().c_str()) 计算完毕。这确保了当函数尝试访问字符串时,提供给 bar() 的指针仍然有效。
因此,可以正确地假设 foo() 返回的临时值将在调用后被销毁bar() 完成,因为这标志着包含临时变量的完整表达式的结束。
以上是为什么临时字符串在创建它的函数返回后仍然有效?的详细内容。更多信息请关注PHP中文网其他相关文章!