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)
数组很容易转换为指针,但并非总是如此.例如,如果您获取数组的地址或获取引用,则原始数组类型不会丢失:
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 *
.
归档时间: |
|
查看次数: |
8638 次 |
最近记录: |