所讨论的代码片段涉及从 foo() 函数返回一个临时 std::string 对象,然后调用 bar( ) 与临时的 c_str() 指针。这种担忧源于这样的假设:临时变量在 bar() 执行之前被销毁。
但是,这个假设是不正确的。根据C语言标准,临时对象一直存在,直到它所参与的完整表达式完成为止。这个概念在下面的代码结构中得到了说明:
____________________ range of full expression bar( foo().c_str() ); ^^^^^ ^ | | birth funeral
在此示例中,foo() 返回的临时对象的生命周期从其在标记为“诞生”的点处的创建延伸到其在“葬礼”处的销毁。 ”。这种销毁发生在调用 bar() 之后,而不是最初想象的之前。
精确的规则指出,当词法上包含右值(右侧表达式)的完整表达式时,临时对象将被销毁负责创建它并完成评估。在给定的代码中,这个完整表达式是函数调用本身,bar( foo().c_str() )。因此,临时对象将继续存在,直到此调用完成,确保 bar() 可以访问其 c_str() 指针。
以上是临时 C 弦的寿命有多长?的详细内容。更多信息请关注PHP中文网其他相关文章!