Почему std:: cbegin возвращает тот же тип, что и std:: begin

cppreference показывает, что это подпись std::cbegin:

template< class C >
constexpr auto cbegin( const C& c ) -> decltype(std::begin(c));

не должен ли он вернуть что-то вроде C::const_iterator вместо?

3 ответов


c Это const ссылка, так std::begin(c) он вернет все, что const перегрузка C::begin() возвращает. Для стандартных типов библиотек, это const_iterator. Для типа массива это указатель на const.

обратите внимание, что это зависит от другой, нестандартной библиотеки, определенной пользователем C, реализуется здраво с const перегрузка C::begin() что возвращает итератор, который дает вам const доступ к элементам контейнера.


std::begin возвращает iterator или const_iterator в зависимости от того, является ли аргумент const или нет, см., например,http://en.cppreference.com/w/cpp/iterator/begin и объявление функции-члена begin для стандартного контейнера http://en.cppreference.com/w/cpp/container/vector/begin

std::cbegin возвращает std::begin возвращает (через decltype), так что если у вас есть


cbegin реализован следующим образом:

template <class C>
auto cbegin(const C& container)->decltype(std::begin(container))
{
   return std::begin(container); // see explanation below
}

соответствующее начало, как показано ниже .

template< class C > 
auto begin( C& c ) -> decltype(c.begin()); //calling container's begin

этот шаблон cbegin принимает любой тип аргумента представление контейнерной структуры данных C и доступ к этому аргументу через ссылку на константный параметр, контейнер. Если C-обычный контейнер тип (например, std::vector), контейнер будет ссылкой на const версия этого контейнера (например, const std::vector&). Вызов нечлен функция begin (предоставленная C++11) в контейнере const дает const_iterator, и этот итератор-это то, что возвращает этот шаблон.

например, если я использовал vector в качестве аргумента для cbegin, как показано ниже .

std::vector<int> v1;
std::cbegin(v1); 

теперь посмотрите, как вычитание шаблона произошло в этом случае, шаблон (класс C) выводится как вектор и параметр cbegin (const c& container) выводится как const vector<int> & . Теперь, поскольку сам контейнер является постоянным , он будет возвращать константу версия начала вектора .

iterator begin();
const_iterator begin() const; //This will be used .
const_iterator cbegin() const;