假设我在下面的代码行使用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()应该无效?
答案 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] );