【问题标题】:Convert a nullptr to std::span将 nullptr 转换为 std::span
【发布时间】:2021-01-04 02:18:06
【问题描述】:

我有一个const z* zs = nullptr;

我想将zs 转换为std::span

当我尝试执行 std::span<const z>(zs) 时,我收到一条错误消息

错误:没有匹配函数调用'std::span::span(const z* const&)'

如何将zs转换成std::span

我试过std::span<const z>(zs[0]) 它似乎可以编译。这样对吗?

【问题讨论】:

  • 您希望span 超过nullptr 的行为如何?这似乎被设计破坏了。
  • 取消引用空指针(这是您尝试执行的操作*(zs + 0),其中zs = nullptr)是未定义的行为。这就是编译器没有错误的原因。
  • 错误信息很简单:你不能仅仅给定一个指针值来构造一个跨度。如果它指向一个有效元素而不是nullptr,这并不重要——问题是跨度必须知道要跨越多少个元素。根据设计,指针不存储任何此类信息。问题是,为什么您要进行这种转换?如果您只是想拥有一个零长度的跨度,那么首先没有理由设置指针。

标签: c++ nullptr std-span


【解决方案1】:

std::span 有一个构造函数,它接受一个指针和一个大小,使用它:

std::span<const z>(zs, 0)

【讨论】:

    【解决方案2】:

    您需要提供一个长度来配合您的指针。空指针指向 0 个元素。你在某处重新分配sz 吗?

    一个空的span 没有参数构造。

    std::span<const z>{}
    

    【讨论】:

      猜你喜欢
      • 2021-03-02
      • 1970-01-01
      • 2021-10-10
      • 2015-04-17
      • 1970-01-01
      • 2020-05-19
      • 2011-09-25
      • 1970-01-01
      • 2012-07-02
      相关资源
      最近更新 更多