我正在尝试为一个C风格的字符串数组(一个指向char的指针数组)获取一个开始和一个结束指针。 为什么我不能调用开始和结束函数来获取它们?
#include <iostream>
#include <iterator>
int main(int argc,char *argv[])
{
char **first=std::begin(argv),**last=std::end(argv);
}
编译器说我对begin(char**&)
答案 0 :(得分:6)
这些函数应用于数组。
至于参数argv
,它实际上有类型char **
,因为按值传递的数组将转换为指向其第一个元素的指针,参数也会调整为指针。
你可以写简单
#include <iostream>
#include <iterator>
int main(int argc,char *argv[])
{
auto first = arg, last = argv + argc;
}
如果函数将相应的参数声明为对数组的引用,则可以使用函数std :: begin和std :: end。例如
int MyMain( char * ( &argv )[10] )
{
auto first = std::begin( argv ), last = std::end( argv );
}
然而,如果写
则是一样的 auto first = argv, last = argv + 10;
以下是如何在C ++标准中定义函数
template <class T, size_t N> T* begin(T (&array)[N]);
4 Returns: array.
template <class T, size_t N> T* end(T (&array)[N]);
5 Returns: array + N.
答案 1 :(得分:1)
编译器面临的问题是它无法猜测argv的大小,因为它不是一个数组而只是一个指针。
数组总是可以用作指针,因为数组可以衰减指向其第一个元素的指针。但反过来是假的!您可以通过数组或通过完全相同的指针访问数组的元素,但指针和数组不一样:
int a[5];
int *p = a; // p[i] and a[i] are now the same
size_t s = sizeof(a); // s is 5 * sizeof(int) 20 on common (32 bits) architectures
size_t s2 = sizeof(p); // s2 is just sizeof(int *) 4 on 32 bits architecture
约定表示argv具有argc元素(并且argv [argc]是一个空指针)。但是std::begin
和std::end
没有使用该约定。所以手工做一个好的程序员:
#include <iostream>
#include <iterator>
int main(int argc,char *argv[])
{
char **first=argv,**last=argv + argc;
}