对于任何泛型类型参数 T,如何将 Fn(T) + 'static 寄存器设置为 'static?

乔齐斯

我正在使用specs crate,它具有Component扩展std::any::Any特性的特性(Any特性只需要'static)。我想在实现的结构中包含一个Box<Fn(T) + 'static>字段(带有通用参数TComponent,这意味着Box<Fn(T) + 'static>需要是'static. 这意味着我需要Fn(T) + 'static'static任何T

它似乎Fn(T) + 'static不适'static用于任何泛型类型参数TT可以引用具有自己生命周期的结构,但我预计它不会成为问题,因为在 中没有具有这些生命周期的引用实例Fn来使Fn自身不存在'static- 这些生命周期仅在传递给 的参数中Fn,但是就好像Fn(T) + 'static被认为包含一个T本身。

例子:

struct HandlesT<T> {
    handler: Box<Fn(T) + 'static>,
}

impl<T> HandlesT<T> {
    pub fn new<F: Fn(T) + 'static>(handler: F) -> HandlesT<T> {
        HandlesT {
            handler: Box::new(handler),
        }
    }
}

trait IsStatic: 'static {}
impl<T> IsStatic for HandlesT<T> {}
error[E0310]: the parameter type `T` may not live long enough
  --> src/lib.rs:14:9
   |
14 | impl<T> IsStatic for HandlesT<T> {}
   |      -  ^^^^^^^^
   |      |
   |      help: consider adding an explicit lifetime bound `T: 'static`...
   |
note: ...so that the type `HandlesT<T>` will meet its required lifetime bounds
  --> src/lib.rs:14:9
   |
14 | impl<T> IsStatic for HandlesT<T> {}
   |         ^^^^^^^^

在这个例子中,因为HandlesT<T>对于任何给定的引用根本不包含非静态引用T(除了那些由 拥有的引用之外根本没有引用Fn,但那些必须是'static),我希望HandlesT<T>对于 any 是静态的T,但错误表明它不是。

编译器的建议“考虑加入势必明确的一生T: 'static”既不支持任何泛型类型参数T,也没有提供线索,为什么HandlesT<T>任何通用的T不是'static,因为HandlesT<T>不包含T

的实施例T: 'static(编译器的建议)不支持任何通用T,在这种情况下&'a i32

struct HandlesT<T: 'static> {
    handler: Box<Fn(T) + 'static>,
}

impl<T: 'static> HandlesT<T> {
    pub fn new<F: Fn(T) + 'static>(handler: F) -> HandlesT<T> {
        HandlesT {
            handler: Box::new(handler),
        }
    }
}

trait IsStatic: 'static {}
impl<T: 'static> IsStatic for HandlesT<T> {}

fn try_nonstatic_t<'a>() {
    let handles_t = HandlesT {
        handler: Box::new(|i: &'a i32| {}),
    };
}
error[E0477]: the type `&'a i32` does not fulfill the required lifetime
  --> src\lib.rs:17:21
   |
17 |     let handles_t = HandlesT {
   |                     ^^^^^^^^
   |
   = note: type must satisfy the static lifetime
乔齐斯

关于此问题的不和谐讨论产生了问题 57325,那里的讨论似乎使事情处于以下状态:

  • 这在逻辑上不正确(“语言疣”)
  • 向后兼容性可能使其无法修复
  • 可能需要一个 RFC 来修复,它被关闭为“目前按预期工作”
  • 请参阅RFC 1214以解释为什么它以今天的方式实施。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

MIPS指令将寄存器设置为1

来自分类Dev

如何将gdb监视点设置为存储在寄存器中的值?

来自分类Dev

我如何static_assert迭代器取消引用的类型?

来自分类Dev

如何将类型名称作为字符串嵌入到static_assert()中?

来自分类Dev

如何使用static_assert检查模板化函数的迭代器参数的元素类型?

来自分类Dev

如何有效地将lc-3寄存器设置为“ 1000000000000000”?

来自分类Dev

如何将泛型(关联类型需要)协议作为委托给任何控制器?

来自分类Dev

GCC ASM将AH寄存器从C设置为1h

来自分类Dev

将 static_cast<int>(-15) 分配给 static const char 类型变量

来自分类Dev

如何使用Fontforge将TTF转换为FNT

来自分类Dev

在C#中将ClientID设置为static

来自分类Dev

设置后的find变量是否为static?

来自分类Dev

将xmm寄存器折叠为标量

来自分类Dev

将xmm寄存器折叠为标量

来自分类Dev

如何在Verilog中为输出分配寄存器?

来自分类Dev

将两个通用值重写为static

来自分类Dev

可以将static_cast转换为相同的类型吗?

来自分类Dev

使用x:Static设置ConverterCulture

来自分类Dev

使用x:Static设置ConverterCulture

来自分类Dev

如何为相同的静态数据设置多个STATIC_URL?

来自分类Dev

如何static_assert模板枚举类型?(C ++ 11)

来自分类Dev

如何检测编译器是否支持static_assert?

来自分类Dev

nodejs express:将express.static路径设置为父文件夹(/ ..)错误

来自分类Dev

将div设置为“ position:static”后,jquery draggable停止工作

来自分类Dev

Static function returning a static instance of the class - shouldn't the instance be the same?

来自分类Dev

为什么url_for()将“ static”作为第一个参数使用?没有static()

来自分类Dev

为什么编译器不能(或不能)推断static_cast的类型参数?

来自分类Dev

如何将NaN插入xmm寄存器?

来自分类Dev

如何将多行插入寄存器?

Related 相关文章

  1. 1

    MIPS指令将寄存器设置为1

  2. 2

    如何将gdb监视点设置为存储在寄存器中的值?

  3. 3

    我如何static_assert迭代器取消引用的类型?

  4. 4

    如何将类型名称作为字符串嵌入到static_assert()中?

  5. 5

    如何使用static_assert检查模板化函数的迭代器参数的元素类型?

  6. 6

    如何有效地将lc-3寄存器设置为“ 1000000000000000”?

  7. 7

    如何将泛型(关联类型需要)协议作为委托给任何控制器?

  8. 8

    GCC ASM将AH寄存器从C设置为1h

  9. 9

    将 static_cast<int>(-15) 分配给 static const char 类型变量

  10. 10

    如何使用Fontforge将TTF转换为FNT

  11. 11

    在C#中将ClientID设置为static

  12. 12

    设置后的find变量是否为static?

  13. 13

    将xmm寄存器折叠为标量

  14. 14

    将xmm寄存器折叠为标量

  15. 15

    如何在Verilog中为输出分配寄存器?

  16. 16

    将两个通用值重写为static

  17. 17

    可以将static_cast转换为相同的类型吗?

  18. 18

    使用x:Static设置ConverterCulture

  19. 19

    使用x:Static设置ConverterCulture

  20. 20

    如何为相同的静态数据设置多个STATIC_URL?

  21. 21

    如何static_assert模板枚举类型?(C ++ 11)

  22. 22

    如何检测编译器是否支持static_assert?

  23. 23

    nodejs express:将express.static路径设置为父文件夹(/ ..)错误

  24. 24

    将div设置为“ position:static”后,jquery draggable停止工作

  25. 25

    Static function returning a static instance of the class - shouldn't the instance be the same?

  26. 26

    为什么url_for()将“ static”作为第一个参数使用?没有static()

  27. 27

    为什么编译器不能(或不能)推断static_cast的类型参数?

  28. 28

    如何将NaN插入xmm寄存器?

  29. 29

    如何将多行插入寄存器?

热门标签

归档