使用Boost static_vector时std::span模板参数推导编译错误及解决
问题概述
以下代码使用std::vector时可正常编译运行:
#include <span> #include <boost/container/static_vector.hpp> #include <iostream> #include <vector> int main(){ boost::container::static_vector<int, 10> x{1,2,3}; std::vector y{1,2,3}; for(const auto& i : std::span(y.begin()+1, y.end())) std::cout << i << '\n'; }
但将循环中的std::vector对象y替换为boost::container::static_vector对象x时,编译会失败。核心原因是boost::container::static_vector的迭代器未适配C++20的std::contiguous_iterator概念,导致std::span的双迭代器构造重载无法匹配。
解决方法
有两种可行的修改方式:
方法一:使用数据指针与长度构造std::span
利用static_vector连续内存存储的特性,直接通过data()获取起始指针,结合偏移和剩余长度构造span:
#include <span> #include <boost/container/static_vector.hpp> #include <iostream> #include <vector> int main(){ boost::container::static_vector<int, 10> x{1,2,3}; // 从第二个元素开始到末尾的span for(const auto& i : std::span(x.data() + 1, x.size() - 1)) std::cout << i << '\n'; }
方法二:显式将迭代器转换为指针
由于static_vector的迭代器指向连续内存,可通过&*操作将迭代器转换为原始指针,满足std::span的构造要求:
#include <span> #include <boost/container/static_vector.hpp> #include <iostream> #include <vector> int main(){ boost::container::static_vector<int, 10> x{1,2,3}; // 显式转换迭代器为指针 for(const auto& i : std::span(&*(x.begin()+1), x.end())) std::cout << i << '\n'; }
补充说明
std::span的双迭代器构造要求迭代器必须满足std::contiguous_iterator概念,而Boost的static_vector迭代器目前未实现该概念的适配标记。通过直接使用指针或显式转指针的方式,可绕过迭代器概念检查的限制,让代码正常编译运行。
内容的提问来源于stack exchange,提问作者dumb0
相关产品推荐
相关产品推荐

