从数组<shared_ptr<void>> 构造一个 span<shared_ptr<T>>

Construct a span<shared_ptr<T>> from an array<shared_ptr<void>>

我有一个 std::array<std::shared_ptr<void>, N>,并且我有访问此缓冲区的不同类型部分的方法,我想将其用于 std::span<std::shared_ptr<T>>

有没有办法在不调用 UB 的情况下构建这样的跨度?

不,这是不可能的:无论将 void* 转换为 T* 的能力如何,您都无法将 void**(指向第一个指针的指针)转换为 T** 因为那里没有实际的 T* 对象,而且您 当然 无法将 std::shared_ptr<A>* 转换为 std::shared_ptr<B>* 任何不同的 ABstd::shared_ptr<T> 不只是内部的 T* (因为控制块),即使它是你也不允许“展开”结构数组并将它们视为其内容的数组(std::complex 除外)。