如何在C++中调用void foo(int (&)[]) {}?

How to call void foo(int (&)[]) {} in C++?

本文关键字:int C++ 调用 void foo      更新时间:2023-10-16
void f1(int (&)[8])
{}
void f2(int (&)[])
{}
int main()
{
    int a[8];
    f1(a); // OK
    f2(/* What should I put here? */); // ???
    return 0;
}

如何调用 f2?

PS: void f2(int (&)[]) {} 在 VC++ 2012 下是合法的。

请考虑以下事项:

template<class T>
struct A
{};
template<class T>
struct A<T[]>
{};
template<class T, size_t size>
struct A<T[size]>
{};

C++有一个明确的规则,不允许引用或指向没有边界的数组作为参数的指针(但这些是有效的类型)。以下是此类参数的有效参数

extern int arg[];

请注意,不能使用具有大小的数组。C++没有类型兼容性概念。C 具有,并使没有大小的数组类型与具有大小的相应数组类型兼容。在C++中,类型系统更加严格,类型有链接,不存在无原型函数类型,所以类型兼容性不是真正的需求,所以C++放弃了它。

"

f2"首先不应该编译。只有当 [] 是第一级间接寻址时,您才能省略数组参数的大小,在这种情况下,它实际上不是一个数组,而是一个指针。在这种情况下,第一个间接寻址级别是 &,因此不能省略 [] 中的大小。