You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从pybind11::array_t创建std::span时编译错误的原因排查

问题:从pybind11::array_t创建std::span时的编译错误

示例代码

void createSpanfromNumpy(pybind11::array_t<int>& inputA, std::vector<int>& inputB)
{
    auto addressA = inputA.data();

    auto addressB = inputB.data();

    std::span<int> testSpanA{ inputA.data(), inputA.size()};


    std::span<int> testSpanB{ inputB.data(), inputB.size() };

    //do stuff with span

}

编译错误信息

Error   C2440   'initializing': cannot convert from 'initializer list' to 'std::span<int,4294967295>'   numpytoSpan 

问题原因与解决办法

问题出在pybind11::array_t<int>::data()返回的是const int*类型的指针,而你声明的std::span<int>需要的是指向非const int的指针(默认的std::span是针对可修改元素的视图)。

对比来看,std::vector<int>&的data()返回的是int*,和std::span<int>的构造参数完全匹配,所以能正常编译;但pybind11的array_t默认的data()返回const指针——这是因为numpy数组可能处于只读状态(比如来自Python的不可变切片),直接用它构造非const的std::span就会触发类型不匹配的编译错误。

你可以根据需求选以下两种解决方式:

  • 若不需要修改数组元素,直接将span改为std::span<const int>:
    std::span<const int> testSpanA{ inputA.data(), inputA.size()};
    
  • 若需要修改数组元素,且确认numpy数组是可写的,改用mutable_data()获取非const指针:
    std::span<int> testSpanA{ inputA.mutable_data(), inputA.size()};
    

内容的提问来源于stack exchange,提问作者Treeman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 21:15:17