C++ 20 接受随机访问容器但拒绝 std::list 的概念

use*_*717 4 c++ c++-concepts c++20

std::vector已知满足 a 的要求RandomAccessContainer,因此使用[]运算符是常数时间。然而,仅满足 a和std::list的较弱要求,因此检索元素是 O(N),而且运算符不存在。ContainerReversibleContainer[]

我想限制一个模板,以便每当[]运算符不存在或不是 O(1) 时我都可以得到一个很好的编译时错误。我怎样才能实现这个目标?

目前,在 g++ 11.2.0 上,当使用以下模板实例化以下模板时,我无法获得干净的错误消息std::list

template<typename RandomAccessContainer>
void foo(RandomAccessContainer const & x);
Run Code Online (Sandbox Code Playgroud)
template<typename ContiguousContainer>
void foo(ContiguousContainer const & x);
Run Code Online (Sandbox Code Playgroud)
template<typename T>
requires ContiguousContainer<T>
void foo(T const & x);
Run Code Online (Sandbox Code Playgroud)

Bar*_*rry 5

Ranges 库附带了一系列与范围相关的概念。在这种情况下,您想要:

template <std::ranges::random_access_range R>
void foo(R&& x);
Run Code Online (Sandbox Code Playgroud)

这个概念不会检查范围本身是否具有[](这对您来说是不够的,map但不是随机访问),但它确实检查迭代器是否是随机访问迭代器,并且随机访问迭代器本身是必需的支持索引。

所以x[2]你不必写ranges::begin(x)[2].