C数组vs指针:数组被视为变量,数组+ 0被视为指针?

时间:2012-07-30 11:54:05

标签: c++ arrays pointers constructor

我在C ++中创建了一个容器类,我有一个来自迭代器的构造函数,所以我可以写MyContainer<double> x(v.begin(), v.end()) vstd::vector<double>。我希望能够用c-array做同样的事情,但是:

double array[3] =  {1., 2. , 3.};
MyContainer<double> x(array, array+3); // Doesn't work : no matching function for call to ‘MyContainer<double>::MyContainer(double [3], double*)’
MyContainer<double> x(array+0, array+3); // Work

问题的根源是什么以及如何解决?

非常感谢。

2 个答案:

答案 0 :(得分:4)

不接受对迭代器的引用,按值获取它们。它试图传递对数组的引用;失败的表达式需要数组衰减为指针。

大概你有

template< typename Iter >
MyContainer( Iter const &first, Iter const &last );

但你需要

template< typename Iter >
MyContainer( Iter first, Iter last );

迭代器需要足够轻量级才能传递值;所有标准模板都这样做。

数组不能用作迭代器,因为它不能递增。存储是固定的。在类似arr + 0的表达式中使用数组或将值按值传递给函数时,它会隐式转换为指向其第一个元素的指针。但是,当通过引用传递时,这种转换不会发生。

答案 1 :(得分:3)

array+0的结果是指针,而array本身不是指针,它是一个数组。您的构造函数没有带有数组和指针的重载,因此编译失败。

处理从数组中创建开始和结束迭代器的问题的惯用方法是使用begin(...)end(...)函数:

MyContainer<double> x(std::begin(array), std::end(array));

重载负责确定数组末尾的位置,使您无需在指针中添加数组长度。