Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::begin()如何适用于内置类型?_C++_C++11 - Fatal编程技术网

C++ std::begin()如何适用于内置类型?

C++ std::begin()如何适用于内置类型?,c++,c++11,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()); 模板 自动开始(C&C)->decltype(C.begin()); 我不明白,它是怎么工作的?。好的,std::b

假设我在下面使用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());
模板
自动开始(C&C)->decltype(C.begin());

我不明白,它是怎么工作的?。好的,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;
}
模板
T*开始(T&ar)[N]){
返回ar;
}
模板
T*结束(T&ar)[N]){
返回ar+N;
}
这些函数为您提供指向普通数组开头和结尾的指针。SFINAE将从重载解析中删除调用成员
c.begin()
的版本。

具有用于内置阵列的其他模板重载版本

(从C++11开始)(直到C++14)

模板
T*begin(T&数组)[N]);
(从C++14开始)

模板
constexpr T*begin(T&数组)[N]);

非常感谢。我们有类似版本的用于阵列的cbegin吗?在阵列上使用cbegin或cend将导致编译错误..对吗?因为没有适合数组的cbegin;全局
cbegin
cend
只需转发到全局
begin
end
,然后添加
const
,这样它们就可以使用数组了。但是,这是一个C++14添加项,您的编译器可能还不支持它。在哪里可以检查这种添加项的语法。甚至说,对于bulit in类型,没有特殊的cbegin/cend。您可以从这里获取标准的草稿:@SACHINGOYAL它应该工作得很好。我在这里试过一次。
template< class T, std::size_t N >
T* begin( T (&array)[N] );      
template< class T, std::size_t N >
constexpr T* begin( T (&array)[N] );