为了账号安全,请及时绑定邮箱和手机立即绑定

编译器建议我添加一个'静态生命周期,因为参数类型可能不够长,但我不认为这是我想要的

编译器建议我添加一个'静态生命周期,因为参数类型可能不够长,但我不认为这是我想要的

编译器建议我添加一个'静态生命周期,因为参数类型可能不够长,但我不认为这是我想要的我正在尝试实现看起来像这个最小例子的东西:trait Bar<T> {}struct Foo<T> {     data: Vec<Box<Bar<T>>>,}impl<T> Foo<T> {     fn add<U: Bar<T>>(&mut self, x: U) {         self.data.push(Box::new(x));     }}由于Rust默认为(据我所知)pass-by-ownership,我的心理模型认为这应该有效。该add方法获取对象的所有权,x并且能够将此对象移动到a中,Box因为它知道完整类型U(而不仅仅是特征Bar<T>)。一旦进入a Box,框内项目的生命周期应该与框的实际生命周期相关联(例如,当pop()从矢量中删除时,对象将被销毁)。然而,很明显,编译器不同意(并且我确定比我更了解...),要求我考虑添加一个'static生命周期限定符(E0310)。我99%肯定这不是我想要的,但我不确定我应该做什么。为了澄清我的想法并帮助识别误解,我的心理模型来自C ++背景,是:Box<T> 本质上是 std::unique_ptr<T>如果没有任何注释,则变量按值传递,Copy否则传递rvalue-reference与参考注释,&大致const&和&mut大致&默认生命周期是词法范围
查看完整描述

2 回答

?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

让我考虑添加一个'静态终身限定符(E0310)。我99%肯定这不是我想要的,但我不确定我应该做什么。

是的。编译器不需要&'static引用,它想要U: 'static

具有U: 'staticU包含生命周期小于的引用的平均值'static。这是必需的,因为您希望将U实例放在没有生命周期的结构中。

trait Bar<T> {}struct Foo<T> {
    data: Vec<Box<dyn Bar<T>>>,}impl<T> Foo<T> {
    fn add<U: Bar<T> + 'static>(&mut self, x: U) {
        self.data.push(Box::new(x));
    }}


查看完整回答
反对 回复 2019-08-23
  • 2 回答
  • 0 关注
  • 503 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信