【发布时间】:2021-07-15 11:06:52
【问题描述】:
可以通过范围构造函数和一对显式迭代器从std::vector(作为连续容器的原型)构造std::span:
#include <span>
#include <vector>
std::vector<int> owning;
std::span<int> view1{owning.begin(), owning.end()}; // works
std::span<int> view2{owning}; // works
但是,当使用 Boost 容器库中的 small_vector(也应该是连续的)执行相同操作时,我遇到了问题 (godbolt):
#include <span>
#include <boost/container/small_vector.hpp>
boost::container::small_vector<int, 10> owning;
std::span<int> view1{owning.begin(), owning.end()}; // Error
std::span<int> view2{owning}; // Error (works with clang + libc++ though)
问题似乎是boost::small_vector 的迭代器不满足std::contiguous_iterator 概念,即gcc 和clang、libc++ 和libstdcxx(godbolt)都失败了:
static_assert(
std::contiguous_iterator<boost::container::small_vector<int, 10>::iterator>);
small_vector 的存储可能在原地或堆上,但始终是连续的。那么这里有什么问题呢?
【问题讨论】:
-
快速搜索显示这刚刚在 github repository 中修复
-
太棒了!我在 repo 上进行了搜索,但只有 PR,而不是问题……我的错,谢谢!如果您将您的评论变成答案,我很乐意接受。
标签: c++ boost c++20 boost-container