从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
相关产品推荐
相关产品推荐

