我在使用带有 c 样式数组参数的 std::begin()
和 std::end()
(来自 iterator
库)时遇到问题。
void SetOrigin(const double i_point[3]) {
Vector v;
std::copy(
std::begin(i_point),
std::end(i_point),
v.begin());
this->setOrigin(v);
}
这会导致 Visual Studio 2010 出现以下错误(结束时类似):
error C2784: '_Ty *std::begin(_Ty (&)[_Size])' : could not deduce template argument for '_Ty (&)[_Size]' from 'const double []'
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\xutility(995) : see declaration of 'std::begin'
将参数更改为非常量会产生相同的结果。
试图将参数指定为
...
std::begin<const double, 3>(i_point),
std::end<const double, 3>(i_point),
...
给出:
error C2664: '_Ty *std::begin<const double,3>(_Ty (&)[3])' : cannot convert parameter 1 from 'const double []' to 'const double (&)[3]'
是否不能在数组参数上使用 std::begin
因为它们衰减为指针?有没有办法解决这个问题,或者最好不要在数组参数上使用迭代器函数?
原文由 A.E. Drew 发布,翻译遵循 CC BY-SA 4.0 许可协议
是的,
std::begin
和std::end
可以 使用 C 样式数组的参数。诀窍在于传递一个 C 样式数组的参数。当您将一维数组指定为普通函数的普通参数时,其类型会默默地从“T 数组”调整为“指向 T 的指针”。当您调用该函数时,传递的不是数组(作为数组),而是指向数组第一个元素的指针。
但是,可以通过引用函数模板来传递数组:
在 这种 情况下,如果您传递的是实际数组(尽管是通过引用)而不是指针,则可以使用
std::begin
和std::end
非常好。例如:现在传递一个数组是微不足道的,例如:
std::begin
和std::end
本身(或至少可以)类似于sum
数组通过引用传递,所以它们看起来像这样:请注意,尽管这些是最近添加到标准中的,但它们不需要任何特别棘手的模板使用,因此上面的实现应该可以在普通的旧 C++98 编译器上正常工作(并且,如果有记忆,即使使用 pre -标准编译器,例如 VC++ 6)。