可以通过范围构造函数和显式迭代器从std::span (作为连续容器的原型)构造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但是,当对Boost容器库中的small_vector (应该也是连续的)做同样的操作时,我遇到了问题(哥德波特):
#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 (哥德波特)都失败了:
static_assert(
std::contiguous_iterator<boost::container::small_vector<int, 10>::iterator>);small_vector的存储可能是就地的,也可能是堆上的,但总是连续的.所以这里有什么问题?
发布于 2021-07-15 13:42:38
std::contiguous_iterator在C++20中有具体要求,它不是任何预C++20接口的一部分.由于这些接口在C++20(特别是contiguous_iterator_tag)之前并不存在,所以small_vector<T>::iterator无法使用它们。
当然,我们可以添加这样一个接口,条件是C++20特性的存在。但是,在C++20出现之前编写的代码如果不进行更新,就无法成为contiguous_iterator。虽然存在C++17 "ContiguousIterator“要求,但它没有标记或其他方法来检测迭代器是否是连续的。C++20在添加适当的概念时添加了这样的标签(和其他东西)。
https://stackoverflow.com/questions/68392683
复制相似问题