我可以在非标准容器上使用迭代器库的访问函数吗?

Can I use the iterator Libraries' Access Functions on Nonstandard Containers?

iterator 库在 C++11、C++14 和 C++17 的过程中引入了很多 access functions

我可以在任何容器上使用这些,甚至是非标准容器(前提是它们提供可访问的相应方法吗?)例如给定一个 QVector foo 我可以这样做吗:

const auto bar = begin(foo);

据我了解,你的问题好像是:如果容器提供了一个成员函数begin,我可以把它作为一个自由函数来调用吗?您的问题的答案是肯定的,因为标准提供了模板化的自由函数 begin,它只是尝试调用成员函数 begin;来自 http://en.cppreference.com/w/cpp/iterator/begin:"Returns an iterator to the beginning of the given container c or array array. These templates rely on C::begin() having a reasonable implementation.".

std::begin的声明如下(来自§24.7):

template <class C> auto begin(C& c) -> decltype(c.begin());
template <class C> auto begin(const C& c) -> decltype(c.begin());

因此,这些函数将为任何 class C 定义,使得 c.begin() 为 "valid"(确实存在)。该标准还保证这些将:

Returns: c.begin().

所以是的你可以在任何C类型的容器上使用begin(c)只要:

  • 提供了成员函数C::begin()
  • 存在 begin(C const&)begin(C &) 函数。

独立的 begin 函数不应位于 std:: 命名空间中,而应位于与 class C 相同的命名空间中,以便名称查找可以找到它。