调用参数作为对 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
是;该模板对您是否可以引用未知边界数组没有影响。
我想了解对未知边界数组的引用是否可以用作 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
是;该模板对您是否可以引用未知边界数组没有影响。