在数组上使用迭代器

Var*_*lex 16 c++ arrays pointers iterator c++11

它在C++ Primer中有说明

在C++中,指针和数组紧密交织在一起.特别是,正如我们将看到的,当我们使用数组时,编译器通常会将数组转换为指针.

我想使用迭代器来打印数组.下面的程序运行正常但是当我尝试打印时,arr2或者arr3如果我没有弄错,哪种类型int *,我得到一个错误(判断&运算符意味着下面的参考).

error: no matching function for call to ‘begin(int*&)’

int main(int argc, char** argv) {

    int arr[] = {0,1,2,3,4,5,6,7,8,9};
    auto arr2 = arr;
    auto arr3(arr);   // I think arr2 and arr3 are of same type

    for(auto it = std::begin(arr) ; it != std::end(arr) ; ++it)
        std::cout << *it << " ";
    std::cout << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

考虑到该语句,如果数组被编译器转换为指针,该程序如何用于打印arr使用的内容,std::begin()并且std::end() 不起作用arr2或者arr3如果所有这些都是指向整数的指针?


编辑

如果我不能说清楚,我很抱歉.我希望我能通过这次编辑澄清问题.

现在我知道begin()并且end()不会使用指针(感谢答案),我想知道引用的文本是不是真的,因为它指定有一个数组 - >指针转换.如果文本说的是真的那么arr应该是指针的类型.此时引用的文字有问题吗?

另外,有没有什么方法可以使用begin()end()指针(而不是STL容器)指定大小,可能使用以下构造函数?

template< class T, size_t N > 
T* begin( T (&array)[N] );
Run Code Online (Sandbox Code Playgroud)

Vau*_*ato 7

数组很容易转换为指针,但并非总是如此.例如,如果您获取数组的地址或获取引用,则原始数组类型不会丢失:

int a[10];
int (&ar)[10] = a; // fine
int (*ap)[10] = &a; // also fine
Run Code Online (Sandbox Code Playgroud)

但是,当您以一种大多数其他类型将被复制的方式使用数组时,该数组将转换为指针并复制指针.

在您的示例中,如果您将其作为参考,则可以使用arr2:

 auto &arr2 = arr;
Run Code Online (Sandbox Code Playgroud)

现在arr2有类型int (&)[10]而不是int *.