std :: begin()如何为内置类型工作?

时间:2016-01-18 09:04:44

标签: c++ c++11

假设我在下面的代码行使用std :: begin。

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

现在std :: begin声明如下。

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

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

2 个答案:

答案 0 :(得分:8)

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

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从重载决议中删除。

答案 1 :(得分:2)

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] );