gpt4 book ai didi

rust - 为什么Arc Result <(),()> + Send + Sync>在编译时不知道syze

转载 作者:行者123 更新时间:2023-12-03 11:36:09 24 4
gpt4 key购买 nike

use std::sync::Arc;
pub type A = Arc<dyn Fn(dyn FnOnce(&mut [u8]), usize) -> Result<(), ()> + Send + Sync>;

pub struct B {
a: A,
}

   Compiling playground v0.0.1 (/playground)
error[E0277]: the size for values of type `(dyn for<'r> FnOnce(&'r mut [u8]) + 'static)` cannot be known at compilation time
--> src/lib.rs:5:8
|
5 | a: A,
| ^ doesn't have a size known at compile-time
|
= help: the trait `Sized` is not implemented for `(dyn for<'r> FnOnce(&'r mut [u8]) + 'static)`
= note: only the last element of a tuple may have a dynamically sized type
我认为 Arc的大小在编译时就知道了。 dyn Fn至少在我执行 pub type A = Arc<dyn Fn() -> Result<(), ()> + Send + Sync>;时具有。但是,当我将 dyn FnOnce(&mut [u8])放入 dyn Dn时,大小是未知的。
为什么 pub type A = Arc<dyn Fn() -> Result<(), ()> + Send + Sync>;可以,但 pub type A = Arc<dyn Fn(dyn FnOnce(&mut [u8]), usize) -> Result<(), ()> + Send + Sync>;不可以?

最佳答案

该错误有点无用,因为它会将您定向到该类型的错误部分。

dyn Fn has [a size]


像任何“裸”特征对象一样, dyn Fn的大小也没有。但是可以,因为 Arc<T>不需要 T: Sized
问题是 dyn FnOnce(&mut [u8])没有大小,因此您不能拥有 Fn(dyn FnOnce(&mut [u8]), usize)。不允许对函数参数进行大小调整。
设置该函数参数 Sized将解决此问题,例如
pub type A = Arc<dyn Fn(&dyn FnOnce(&mut [u8]), usize) -> Result<(), ()> + Send + Sync>;
// ^--- added &

值得 reporting a bug,以便可以改善此错误消息。

关于rust - 为什么Arc <dyn Fn(dyn FnOnce(&mut [u8]),usize)-> Result <(),()> + Send + Sync>在编译时不知道syze,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66576649/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com