我正在尝试初始化一些可以为空的非可复制类型的固定大小的数组,就像Option<Box<Thing>>某种类型的那样Thing.我想把它们中的两个打包成一个没有任何额外间接的结构.我想写这样的东西:
let array: [Option<Box<Thing>>; SIZE] = [None; SIZE];
Run Code Online (Sandbox Code Playgroud)
但它不起作用,因为[e; n]语法要求e实现Copy.当然,我可以将它扩展为SIZE Nones,但是当SIZE它很大时,这可能是笨重的.我不相信这可以用没有非自然编码的宏来完成SIZE.有没有好办法呢?
是的,这很容易unsafe; 没有办法unsafe吗?
std::list由分配器类型参数化,它可能会重新绑定该类型以分配列表节点而不是Ts。那么它对传递给构造函数的分配器类型的对象做了什么?
template <class T, class Alloc = std::allocator<T>>
class list
{
class node { ... T element; ... };
using real_alloc =
typename std::allocator_traits<Alloc>::template rebind_alloc<node>;
real_alloc m_allocator;
public:
list(const Alloc&);
};
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,我们需要初始化m_allocator一个节点分配器,但是构造函数被赋予了一个T分配器。我们是直接将T分配器扔在地板上,还是以某种方式使用它?
我正在转换一些旧的 Rust 代码以在 1.0.0 上工作。我需要转换一个在字符上使用迭代器的函数,它曾经是这样写的:
fn f<I: Iterator<char>>(char_iter: I)
Run Code Online (Sandbox Code Playgroud)
现在Iterator不带参数,对的约束I只能是I: Iterator. 那么元素类型是I::Item。有没有办法表达I::Item=的约束char?(或者我应该完全以另一种方式这样做吗?)