std::span
可以通过范围构造函数和一对显式迭代器从 a构造 a std::vector
(作为连续容器的原型):
#include <span>
#include <vector>
std::vector<int> owning;
std::span<int> view1{owning.begin(), owning.end()}; // works
std::span<int> view2{owning}; // works
但是,当使用small_vector
Boost 的容器库中的一个也应该是连续的时,我遇到了问题(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
and clang
, libc++
and libstdcxx
( godbolt ):
static_assert(
std::contiguous_iterator<boost::container::small_vector<int, 10>::iterator>);
的存储small_vector
可能就地或堆上,但始终是连续的。那么这里有什么问题呢?