Rust中foo1编译通过foo2报错的原因解析
为什么带引用参数的函数返回&str能通过编译,无参数的却不行?
先看你给出的代码:
fn main() { let a = 33; let x = foo1(&a); let y = foo2(); println!("{x} {y}"); } fn foo1(_a: &i32) -> &str { let x = "ddd"; return x; } fn foo2() -> &str { let x = "ddd"; return x; }
编译时foo1正常通过,foo2却报出missing lifetime specifier错误,核心原因是Rust的生命周期省略规则在两种场景下的应用不同:
1. foo1能编译的原因
Rust编译器有一套默认的生命周期省略规则,其中一条是:当函数只有一个输入生命周期参数时,返回值的生命周期会被自动推断为和这个输入参数的生命周期一致。
对于foo1,编译器会自动为它补全生命周期标注,等价于:
fn foo1<'a>(_a: &'a i32) -> &'a str { let x = "ddd"; return x; }
而你返回的字符串字面量"ddd"属于&'static str——它的生命周期贯穿整个程序运行期,'static是所有生命周期的超集,因此可以被安全地强制转换为'a生命周期,完全符合编译器的要求,所以编译通过。
2. foo2编译失败的原因
foo2没有任何输入引用参数,编译器找不到可以用来推断返回值生命周期的“锚点”。此时Rust要求必须显式指定返回值的生命周期,否则无法确定这个引用的有效范围。
因为你返回的是字符串字面量,它的生命周期是'static,所以只需要把函数签名改成fn foo2() -> &'static str,就能解决编译错误。
内容的提问来源于stack exchange,提问作者Reffel KF
相关产品推荐
相关产品推荐

