std::begin() 如何用于内置类型

How does std::begin() work for builtin types?

本文关键字:用于 内置 置类型 begin std 何用于      更新时间:2023-10-16

>假设我在下面有几行代码,我正在使用std::begin 。

int myint[] ={1,2,3,4,5,6,7,8,9};
std::find(begin(myint),end(myint),9);

现在 std::start 声明如下。

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

我无法理解,它是如何工作的?AFAIK,返回 std::begin 的类型是 decltype(c.begin()),当 C 作为整数数组传递时,不会有任何带有整数的 begin 函数。所以 c.begin() 应该是无效的?

它没有。您缺少的是编译器为内置数组选择的另一个版本的开始/结束对,它大致如下所示:

template <typename T, std::size_t N>
T* begin(T (&ar)[N]) {
  return ar;
}
template <typename T, std::size_t N>
T* end(T (&ar)[N]) {
  return ar + N;
}

这些函数为您提供指向普通数组的开头和结尾的指针。调用成员c.begin()的版本由 SFINAE 从重载解析中删除。

std::begin 有其他用于内置数组的模板重载版本。

(自C++11起)(至C++14)

template< class T, std::size_t N >
T* begin( T (&array)[N] );      

(自C++14起)

template< class T, std::size_t N >
constexpr T* begin( T (&array)[N] );