Rust报错cannot infer an appropriate lifetime的产生原因是什么
E0495 错误含义详解
该错误的核心是两组互斥的生命周期约束无法被同时满足,结合代码与编译器提示的具体冲突逻辑如下:
前置约定
你为WeightedDirectedGraph、Node、Edge三个结构体都标注了统一的生命周期参数'a,这意味着Edge<'a>中存储的to_node、cost两个引用的存活时间,必须和整个WeightedDirectedGraph<'a>实例的生命周期'a完全对齐。
具体冲突点
- 第一组约束:
add_edge方法的&mut self参数未显式标注生命周期,Rust会为它分配一个仅覆盖当前方法调用周期的匿名生命周期,该生命周期远短于结构体的'a生命周期。你取&self.nodes[to_node_index]引用时,编译器要求这个引用的生命周期不能超过&mut self的匿名生命周期,避免出现指向已失效内容的悬垂引用,这对应报错信息中的前两条note。 - 第二组约束:你显式声明了
new_edge的类型为Edge<'a>,要求它内部的to_node引用必须存活满整个'a生命周期,这和第一组约束的要求直接矛盾,编译器找不到一个能同时符合两组要求的生命周期,因此抛出该错误,对应报错信息中的后两条note。
此外代码中的cost: &cost写法存在相同的逻辑问题:cost是add_edge方法的栈传入参数,方法执行结束后就会被销毁,将它的引用存入要求存活'a周期的Edge实例中,必然会产生悬垂引用,同样会触发生命周期冲突。
内容的提问来源于stack exchange,提问作者Matthew McPeak
相关产品推荐
相关产品推荐

