首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Boost的small_vector的迭代器类型不应该满足std::contiguous_iterator的概念吗?

Boost的small_vector的迭代器类型不应该满足std::contiguous_iterator的概念吗?
EN

Stack Overflow用户
提问于 2021-07-15 11:06:52
回答 1查看 142关注 0票数 2

可以通过范围构造函数和显式迭代器从std::span (作为连续容器的原型)构造std::vector

代码语言:javascript
复制
#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 (应该也是连续的)做同样的操作时,我遇到了问题(哥德波特):

代码语言:javascript
复制
#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概念,即gccclanglibc++libstdcxx (哥德波特)都失败了:

代码语言:javascript
复制
static_assert(
    std::contiguous_iterator<boost::container::small_vector<int, 10>::iterator>);

small_vector的存储可能是就地的,也可能是堆上的,但总是连续的.所以这里有什么问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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在添加适当的概念时添加了这样的标签(和其他东西)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68392683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档