允许通过引用传递数组吗?
void foo(double& *bar)
似乎我的编译器说不。为什么?通过引用传递数组的正确方法是什么?还是可以解决?我有一个数组参数,我的方法应修改该参数,然后再检索。另外,我可以使该数组成为一个类成员,可以很好地工作,但是它对我代码的其他部分有很多缺点(我想避免)。
感谢致敬。
允许通过引用传递数组吗?
void foo(double& *bar)
似乎我的编译器说不。为什么?通过引用传递数组的正确方法是什么?还是可以解决?我有一个数组参数,我的方法应修改该参数,然后再检索。另外,我可以使该数组成为一个类成员,可以很好地工作,但是它对我代码的其他部分有很多缺点(我想避免)。
感谢致敬。
std::vector
?
std::vector
如果大小是动态的/未知的,@ moooeeeep显然是更好的选择,但是在大小总是相同的情况下,它会显得过大,从而std::array
解决了语法上的丑陋,同时还赋予了值语义。
Answers:
数组只能通过引用传递,实际上:
void foo(double (&bar)[10])
{
}
这样可以防止您执行以下操作:
double arr[20];
foo(arr); // won't compile
为了能够将任意大小的数组传递给foo
,使其成为模板并在编译时捕获该数组的大小:
template<typename T, size_t N>
void foo(T (&bar)[N])
{
// use N here
}
您应该认真考虑使用std::vector
,或者如果您有支持c ++ 11,的编译器std::array
。
foo
,数组就会衰减到指针”。不,不是,并且由于只能传递10个元素的数组,因此不需要有关大小的更多信息。(再一次,你不能传递一个数组void foo( double*& )
的隐式转换的结果是一个右值,不能被用来初始化非const引用您必须使用; void foo( double *const & );
。
void foo(T &bar[N])
在模板中进行操作-但这实际上是“引用数组”而不是“引用数组”。
std::vector
(大小正确),您将如何将向量的内容(可能是通过获取的std::vector::data()
)转换为该数组类型?类型参数中固定数组大小的语法是什么(即与一起使用static_cast<>
)?
reinterpret_cast
将动态分配的数组(分配后没有内在大小)视为具有固定大小的自动数组时没有任何余地。此外,这是一个错误的问题:正确的问题是“如何重构代码以同时使用两种类型的容器?”,答案是模板和迭代器/范围,或者因为您说的大小是固定的,所以一个函数仅使用数据指针/ ref并硬编码大小(或者,如果大小可能不同,则使用数据/大小适配器,如span
)
是的,但是当对引用进行参数匹配时,指向指针的隐式数组不是自动的,因此您需要执行以下操作:
void foo( double (&array)[42] );
要么
void foo( double (&array)[] );
但是请注意,匹配时,double [42]
和double []
是不同的类型。如果您有一个未知维度的数组,它将与第二个匹配,但不匹配第一个;如果您有一个包含42个元素的数组,则将与第一个匹配但不与第二个匹配。(恕我直言,后者非常违反直觉。)
在第二种情况下,您还必须传递维度,因为一旦进入函数内部就无法恢复它。
double []
并且double [42]
是两种不同的类型。因此,您可以传递给后一种形式的唯一一件事就是长度未知的数组,例如extern double d[];
,或类似的长度。限制了可用性。)
如果只想修改元素:
void foo(double *bar);
足够。
如果要将地址修改为(例如:)realloc
,但不适用于数组:
void foo(double *&bar);
是正确的形式。
在使用C ++时,这里仍然缺少强制性建议std::vector<double>
。
您可以通过引用轻松传递它:
void foo(std::vector<double>& bar) {}
并且,如果您有C ++ 11支持,请参阅std::array
。
以供参考:
std::vector
通常是最好的解决方案。但是也有例外。
就像其他答案说的那样,在&
后面加上*
。
这提出了一个有趣的观点,有时可能会造成混淆:类型应该从右到左读取。例如,这是(从最右边开始*
)一个指向int的常量指针的指针。
int * const *x;
因此,您编写的内容将是指向引用的指针,这是不可能的。
在这里,Erik解释了通过引用传递数组的每种方式:https : //stackoverflow.com/a/5724184/5090928。
同样,您可以创建一个数组引用变量,如下所示:
int arr1[] = {1, 2, 3, 4, 5};
int(&arr2)[5] = arr1;