代码之家  ›  专栏  ›  技术社区  ›  pm100

是一个大小为N的c++数组,是一个不同的类型[重复]

  •  0
  • pm100  · 技术社区  · 2 年前

    我想

    int a1[5];
    

    int a2[6];
    

    是不同的类型。

    但是

    void foo(int a[5]){};
    void foo(int a[6]){};
    

    不会编译,说它们是foo的重复定义(即 foo(int *a) )

    我对此感到非常惊讶。我看到的c++标准中不允许使用VLA的原因之一是因为它们破坏了类型系统。

    我还惊讶地发现c也在做同样的事情。

    void foo(int a[4]){
       printf("sz=%ld", sizeof(a));
    }
    

    报告指针大小。我本以为它会报道 4*sizeof(int) (并且只接受类型为的变量 int[4] 作为调用参数接受)

    1 回复  |  直到 2 年前
        1
  •  2
  •   HolyBlackCat    2 年前

    是的,它们是不同的类型,这可以通过以下内容来确认:

    int a[5];
    int b[6];
    static_assert(!std::is_same_v<decltype(a), decltype(b)>);
    

    您的问题是,在函数参数列表中,数组被指针无声地替换,因此两者 void foo(int a[5]) void foo(int a[6]) 最终成为 void foo(int *a)

    这种情况只发生在数组上,而不是例如对数组的引用,因此 void foo(int (&a)[5]) 会起作用(或 int (*a)[5] 在C)中。