从数组<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>*
任何不同的 A
和 B
—std::shared_ptr<T>
不只是内部的 T*
(因为控制块),即使它是你也不允许“展开”结构数组并将它们视为其内容的数组(std::complex
除外)。
我有一个 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>*
任何不同的 A
和 B
—std::shared_ptr<T>
不只是内部的 T*
(因为控制块),即使它是你也不允许“展开”结构数组并将它们视为其内容的数组(std::complex
除外)。