Почему 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;