在函数中传递数组作为引用参数

Passing arrays as reference arguments in function

本文关键字:引用 参数 数组 函数      更新时间:2023-10-16

我试图将两个多维数组作为引用参数传递给c++中的函数。

原型是这样写的:

void func(char (&foo)[4][4], char (&bar)[4][4]);

我的问题是第二个参数没有作为引用参数传递,但是第一个参数传递了。如果我改变它们的位置——所以(&foo)[4][4]是第二个,反之亦然——foo不会作为引用传递,但bar会。

但是,如果我添加第三个参数,第二个参数将作为引用传递。

如何在不添加另一个无用参数的情况下解决这个问题?

通过使用typedefs:

来尽量减小脚的大小。
typedef char charray44[4][4];
void foo(charray44 & one, charray44 & two);

这应该工作如预期;如果没有,您应该能够设置一个简单的测试工具来找出代码中哪里(否则)出错了。

void foo(char (&one)[4][4], char (&two)[4][4]){
}
int main(){
    char one[4][4];
    char two[4][4];
    foo(one, two);
}

在MSVC, GCC和Clang上可以很好地编译。你的问题在别处

作为Xeos解决方案的补充,解决此问题的一个更好的方法可能是封装数组并通过引用传递新对象。

class matrix{
     std::vector<char> values;
     size_t x_sz, y_sz;
public:
     matrix(size_t x, size_t y) : values(x*y), x_sx(x), y_sz(y) {}
     char& get_at(size_t x, size_t y) 
     { return values[y*x_sz+x]; }
     const char& get_at(size_t x, size_t y) const
     { return values[y*x_sz+x]; }
 };

则可以直接传递给。

   void f(const matrix& a);