std::begin() 如何用于内置类型
How does std::begin() work for builtin types?
>假设我在下面有几行代码,我正在使用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] );
相关文章:
- 内置函数可查看CPP中的成员变量
- 是否有内置方法可以强制转换为不同的基础类型,但保留常量限定符?
- 按字母顺序对字符串中的字母进行排序,而无需使用内置的 sort()
- 将字符串转换为浮点数或整数,而无需使用内置函数(如 atoi 或 atof)
- 如何从 c++ 中类中内置的数组继承
- 如何捕获 C++ 内置异常对象
- macOS 是内置在 clang 编译器中还是内置于 xcode ide 中?
- 将编译器开关添加到 Eclipse CDT 内置编译器设置生成?
- 是否有用于元素部分移位的 simd 指令/内在/内置指令?
- 内置用于比较两个(或多个)值的方式
- MATLAB API用于使用MatgetDir的C例外:Matrix :: Serialize ::在内存位置内置
- 是否有内置函数可用于boost :: numeric ::间隔
- c++win32中是否有用于数字系统转换的内置函数
- 从Python转换器用于内置类型
- 内置对象,用于在 boost 中访问 cdf 和 pdf
- std::result_of 用于内置运算符
- std::begin() 如何用于内置类型
- 内置函数中的Round()不适用于Turbo C++v4.0
- 用于数组、向量、内置类型、STL的C++模板函数
- 开始和结束函数用于内置数组类型