【问题标题】:Construct a span<shared_ptr<T>> from an array<shared_ptr<void>> [closed]从数组<shared_ptr<void>> 构造一个跨度<shared_ptr<T>> [关闭]
【发布时间】:2020-10-25 15:17:51
【问题描述】:

我有一个std::array&lt;std::shared_ptr&lt;void&gt;, N&gt;,我有方法可以将这个缓冲区的一部分作为不同的类型访问,我想使用std::span&lt;std::shared_ptr&lt;T&gt;&gt;

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

【问题讨论】:

  • 如果我理解正确,是的,它应该可以工作。你试过了吗?它奏效了吗?如果没有,您能否发布您尝试过的完整代码,以及哪些不起作用?
  • @JohnZwinck 看起来我可以用整个数组构造跨度,但不能使用迭代器/大小组合。我想我可以使用 subspan() ,所以这可能会起作用。我通常仍然无法编译 C++20,所以我还不能比我的 IDE 告诉我的更进一步测试

标签: c++ shared-ptr c++20 std-span


【解决方案1】:

不,这是不可能的:无论将void* 转换为T* 的能力如何,您都无法将void**(指向您的第一个指针的指针)转换为T**,因为没有实际的@987654325 @ 对象,你当然不能将std::shared_ptr&lt;A&gt;* 转换为std::shared_ptr&lt;B&gt;* 任何不同的ABstd::shared_ptr&lt;T&gt; 不仅仅是内部的T*(因为控制块的),即使你不允许“解包”结构数组并将它们视为内容数组(std::complex 的神奇例外)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-22
    • 1970-01-01
    • 2014-11-09
    • 1970-01-01
    • 1970-01-01
    • 2012-05-14
    • 1970-01-01
    • 2013-01-13
    相关资源
    最近更新 更多