Rust 中函数调用内临时对象的作用域规则是什么?我真正感兴趣的是以下操作是否安全:
fn foo() -> CString { /* */ }
fn bar(arg: *const libc::c_char) { /* */ }
bar(foo().as_ptr())
我创建了最小的示例,它按照我想要的方式工作——函数调用返回后对象被删除。
struct Bar {
pub x: u32
}
impl Bar {
pub fn new(x: u32) -> Self {
println!("New Bar made!");
Bar { x }
}
pub fn extract(&self) -> u32{
self.x
}
}
impl Drop for Bar {
fn drop(&mut self) {
println!("Bar dropped!");
}
}
pub fn foo(arg: u32) {
println!("Function called with arg = {}", arg);
}
fn main () {
foo(Bar::new(12).extract());
}
我可以依赖这种行为吗?
In the 铁锈参考 https://doc.rust-lang.org/reference/expressions.html#temporary-lifetimes,在“临时生命周期”下,它说:
...临时值的生命周期通常是
- 最里面的封闭语句;块的尾部表达式被视为包含该块的语句的一部分,或者
您的案例中最内层的封闭语句是调用bar( )
。同一部分中有一些与您的案例非常相似的示例。
如果不是这种情况,编译器将不会编译您的代码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)