为什么结构中的 Box 需要“显式生命周期限制”?

2024-02-13

编者注:此代码在之后不再产生相同的错误RFC 599 https://github.com/rust-lang/rfcs/blob/master/text/0599-default-object-bound.md已实施,但答案中讨论的概念仍然有效。

我正在尝试编译这段代码:

trait A {
    fn f(&self);
}

struct S {
    a: Box<A>,
}

我收到此错误:

a.rs:6:13: 6:14 error: explicit lifetime bound required
a.rs:6     a: Box<A>,

I want S.a拥有一个实例A,并且不知道这个生命周期在这里是如何合适的。我需要做什么才能让编译器满意?

我的铁锈版本:

rustc --version
rustc 0.12.0-pre-nightly (79a5448f4 2014-09-13 20:36:02 +0000)

(有点迂腐的观点:A是一个特质,所以S不拥有的实例A,它拥有一个盒装实例某种类型的实现A.)

特征对象表示具有某种未知类型的数据,也就是说,关于该数据唯一已知的是它实现了该特征A。由于类型未知,编译器无法直接推断所包含数据的生命周期,因此需要在特征对象类型中显式声明此信息。

这是通过以下方式完成的Trait+'lifetime。最简单的路线就是使用'static,也就是说,完全禁止存储因范围而变得无效的数据:

a: Box<A + 'static>

以前,(在有生命周期限制的特征对象的可能性和这个之前explicit lifetime bound required引入了错误消息)所有装箱特征对象都是隐式的'static,也就是说,这种限制形式是唯一的选择。

最灵活的形式是将生命周期暴露在外部:

struct S<'x> {
    a: Box<A + 'x>
}

这允许S存储实现的任何类型的特征对象A,可能对范围有一些限制S是有效的(即对于类型'x小于'static the S对象将被困在某个堆栈帧内)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么结构中的 Box 需要“显式生命周期限制”? 的相关文章

随机推荐