在传递数组作为值的函数中基于范围的for循环
Range based for loop in function which passes an array as value
这些天我自己学习c++,我有一些问题理解为什么这段代码不能使用#g++ -std=c++11 source.cpp
编译。实际上,我使用哪种标准并不重要,它就是无法编译。
#include <iostream>
#include <string>
using namespace std;
int print_a(char array[])
{
for(char c : array)
cout << c;
cout << endl;
return 0;
}
int main(void)
{
char hello[] {"Hello!"};
print_a(hello);
return 0;
}
错误信息:
debian@debian:~/Documents$ g++ -std=c++11 source.cpp
source.cpp: In function ‘int print_a(char*)’:
source.cpp:6:15: error: ‘begin’ was not declared in this scope
for(char c : array)
^
source.cpp:6:15: note: suggested alternatives:
In file included from /usr/include/c++/4.9/bits/basic_string.h:42:0,
from /usr/include/c++/4.9/string:52,
from /usr/include/c++/4.9/bits/locale_classes.h:40,
from /usr/include/c++/4.9/bits/ios_base.h:41,
from /usr/include/c++/4.9/ios:42,
from /usr/include/c++/4.9/ostream:38,
from /usr/include/c++/4.9/iostream:39,
from source.cpp:1:
/usr/include/c++/4.9/initializer_list:89:5: note: ‘std::begin’
begin(initializer_list<_Tp> __ils) noexcept
^
/usr/include/c++/4.9/initializer_list:89:5: note: ‘std::begin’
source.cpp:6:15: error: ‘end’ was not declared in this scope
for(char c : array)
^
source.cpp:6:15: note: suggested alternatives:
In file included from /usr/include/c++/4.9/bits/basic_string.h:42:0,
from /usr/include/c++/4.9/string:52,
from /usr/include/c++/4.9/bits/locale_classes.h:40,
from /usr/include/c++/4.9/bits/ios_base.h:41,
from /usr/include/c++/4.9/ios:42,
from /usr/include/c++/4.9/ostream:38,
from /usr/include/c++/4.9/iostream:39,
from source.cpp:1:
/usr/include/c++/4.9/initializer_list:99:5: note: ‘std::end’
end(initializer_list<_Tp> __ils) noexcept
^
/usr/include/c++/4.9/initializer_list:99:5: note: ‘std::end’
不能编译的原因是在c++中,函数参数如char array[]
被调整为为char* array
。你的函数看起来就像
int print_a(char* array)
{
....
}
和基于范围的循环不能处理指针。
一个解决方案是通过引用传递数组。c++不允许按值传递普通数组。例如,这将接受包含5个char
s的数组:
int print_a(const char (& array)[5])
{
for(char c : array) cout << c;
cout << endl;
return 42;
}
为了将其推广到不同大小的数组,您可以使用模板:
template <std::size_t N>
int print_a(const char (& array)[N])
{
for(char c : array) cout << c;
cout << endl;
return 42;
}
当然,还有更简单的方法来打印以空结尾的字符串:
char hello[] {"Hello!"};
cout << hello << endl;
标准库类型使得传递字符串或字符缓冲区对象更容易。例如,std::string
, std::vector<char>
, std::array<char, N>
(其中N
是编译时间常数)
当你将数组传递给函数时,它会"衰减"为指针。在函数中看起来像这样:int print_a(char *array) {...}
你正在使用的循环类型,称为范围循环,不能处理指针,这是错误的根源(试图迭代指针是没有意义的)。
必须通过引用传递数组,或者直接使用常规的for循环。
老实说,如果你在用c++,那就用c++吧。使用std::string, or std::vector
这里
int print_a(char array[])
{
for(char c : array)
cout << c;
cout << endl;
return 0;
}
数组被衰减为pointer
,因为当你传递一个数组的值时,你到底在做什么来传递指针到数组的第一个元素,基于范围的循环不能与指针一起工作,因此你得到的错误。
查看数组是如何衰减的,以及如何解决。
相关文章:
- 为什么我的变量存在于其范围之外
- set_intersection范围范围
- 满足标准::范围::范围概念
- 向量向量的范围范围
- C++参数类型以接受适用于基于范围的 for 循环的所有序列
- 代码具有特定于函数的变量,用于更改范围之外的值
- 将自适应阈值应用于范围函数 opencv c++
- 用辅助方法范围范围的问题来操纵字符串
- C++:将参数应用于函数范围
- C++11:用容器参数定义函数(类似于基于范围的)
- 在C /STL中,是否有相当于Python范围()的紧凑型
- 用于循环范围范围
- 如何制作增强多指数复合范围语句,等效于x和y
- std::copy_n 是否适用于重叠范围?
- 依赖于模板参数的范围查找
- 标准算法 any_of()、all_of() 和 none_of() 应用于空范围
- 常数,但仅适用于此范围的剩余部分
- 确定谓词是否适用于一个范围的全部、部分或全部元素
- 延长临时的生命周期,适用于块范围的聚合,但不是通过"新";为什么?
- 矢量超出范围/范围检查