为何无参数Rust函数需标注生命周期?附编译失败示例
Rust无参数函数的生命周期标注问题
为什么第二个代码无法编译?
Rust的核心规则之一:所有返回引用的函数,必须明确或让编译器推导返回值的生命周期。当函数没有输入参数时,编译器没有可关联的输入生命周期(Rust的生命周期省略规则只适用于存在输入引用参数的场景),无法自动推断返回引用的存活时长。
另外,代码里返回的&10,虽然整数字面量实际属于静态存储区、生命周期是'static,但编译器不会默认做这个推断——在没有显式生命周期标注的情况下,编译器会判定你试图返回函数内临时值的引用,而这个临时值会在函数执行结束后被销毁,导致返回悬垂引用,因此直接报错。
为什么第一个代码可以编译?
显式声明生命周期'a后,相当于告诉编译器:返回的引用可以存活任意时长'a。由于静态生命周期'static可以强制转换为任何生命周期(静态值从程序启动到结束都存在,自然满足任意生命周期的要求),而10作为整数字面量属于'static,因此可以被转换成&'a i32返回。
不过要注意,这种写法其实是把静态值的引用“伪装”成了通用生命周期的引用,调用者可能会误以为这个引用的生命周期和某个外部变量绑定,实际它的生命周期是'static。
内容的提问来源于stack exchange,提问作者Mhmd Al-Rshedy
相关产品推荐
相关产品推荐

