如何在C++函数中通过引用传递数组?

ttp71kqs  于 2023-06-25  发布在  其他
关注(0)|答案(2)|浏览(169)

有没有一种方法可以将默认值传递给数组,而数组是通过引用传递给函数的,这样就不需要传递它了?
我有一个这样的函数:

  1. void foo(int (&arr) [3])
  2. {
  3. //some code...
  4. }

然后我试了这个:

  1. void foo(int (&arr) [3] = nullptr)
  2. {
  3. //some code...
  4. }

但它显然不起作用,因为引用不能是nullptr,它甚至不是一个数组。
编辑:如果可能的话,我不想使用std::array,我还需要知道传递数组的大小而不传递它的大小,这就是为什么我没有这样做:int (*arr)[3]

z6psavjg

z6psavjg1#

在C++中,不能直接将默认值传递给通过引用传递的数组。但是,您可以通过使用接受默认数组并使用该数组调用原始函数的版本来重载该函数来实现类似的效果。
这里有一个代码

  1. void foo(int (&arr)[3]){}
  2. void foo()
  3. {
  4. int defaultArr[3] = {1, 2, 3};
  5. foo(defaultArr);
  6. }
  7. int main()
  8. {
  9. int arr[3] = {2, 1, 4};
  10. foo(arr);
  11. foo();
  12. return 0;
  13. }
展开查看全部
p5cysglq

p5cysglq2#

我还需要知道传递的数组的大小,而不传递它的大小,这就是为什么我没有这样做:int (*arr)[3]
这个解释对我来说没有意义。数组大小以指针类型进行编码。简单地间接通过指针,你会得到一个int (&arr) [3]。示例:

  1. void foo(int (*arr)[3] = nullptr)
  2. {
  3. if (arr)
  4. std::cout << std::size(*arr);
  5. else
  6. std::cout << "nullptr";
  7. }

因此,使用指向数组的指针是对您问题的回答。
另一种选择是使用可选的span:

  1. void foo(std::optional<std::span<int, 3>> arr = std::nullopt)

虽然参数类型有点冗长,但这允许您直接传递数组而不使用addressof运算符。此外,这还允许传递其他连续范围,而不仅仅是数组。
如果您在编译时知道需要默认选项,那么我建议使用Syed的答案中的重载解决方案,但如果该选项是在运行时确定的,那么这将不起作用。

展开查看全部

相关问题