重新访问临时对象的生命周期
提供的代码片段展示了 C 中临时对象的有趣行为。考虑以下内容:
std::string foo() { std::string out = something...; return out; } void bar(const char* ccp) { // Do something with the string... } bar(foo().c_str());
问题出现了:为什么 foo() 返回的临时变量的“c_str()”指针仍然有效?常识可能表明应该在调用 bar() 之前销毁临时对象。然而,事实并非如此。
根据 C 标准,临时对象的生命周期会延长,直到词法上包含创建该对象的右值的完整表达式的求值完成为止。这意味着在给定的代码中, foo() 返回的临时对象将保持活动状态,直到对 bar() 的调用完成后。
为了形象化这个概念,请考虑以下内容:
____________________ full-expression ranges from 'b' to last ')' bar(foo().c_str()); ^^^^^ ^ | | birth funeral
临时对象是在调用 foo() 时创建的(表示为“诞生”)。它在整个表达式的求值过程中保持活动状态,在本例中是函数调用 bar(foo().c_str())。一旦函数调用完成,临时对象就会被销毁(表示为“葬礼”)。
以上是为什么 C 临时字符串的 `c_str()` 在函数调用后仍然有效?的详细内容。更多信息请关注PHP中文网其他相关文章!