调用参数作为对 C++ 中未知边界数组的引用

Call Parameter as Reference to Array of Unknown Bound in C++

我想了解对未知边界数组的引用是否可以用作 C++ 函数中的调用参数。下面是我的例子:

示例 1

void func(int (&a)[])
{
}
int main()
{
   cout << "Hello World" << endl; 
   int k[] = {1,2,3};
  // k[0] = 3;
   func(k);
   return 0;
}

令我惊讶的是,上面的示例 1 在使用 GCC 10.1.0 和 C++11 编译时有效,但不适用于低于 10.x 的 GCC 版本。我不认为我们可以在 C++ 中引用未知大小的数组。但是这段代码如何在以下 link 编译:successfully compiled

我的第二个问题是我们可以为函数模板做这个吗?例如,

示例 2

template<typename T1>
void foo(int (&x0)[])
{
}

示例 2 在任何版本(如 C++17 等)中都是有效的 C++ 代码。我在一本书中看到了示例 2 的用法,其中他们将 int (&x0)[] 作为模板函数的函数参数。

I don't think that we can have references to arrays of unknown size in C++.

以前是这样的,虽然被认为是语言缺陷。从 C++17 开始就允许了。

请注意,从已知边界数组到未知边界数组的隐式转换——这就是你在示例 1 main 中所做的——在 C++20 之前是不允许的。

Is example 2 valid C++ code in any version like C++17

是;该模板对您是否可以引用未知边界数组没有影响。