C++ 为什么数组参数的指针衰减似乎不适用于sizeof()?

C++ 为什么数组参数的指针衰减似乎不适用于sizeof()?,c++,c,pointers,C++,C,Pointers,我之前读过一个问题,由于与此完全相同,所以该问题被关闭 及 但读完这篇文章后,我仍然对sizeof()的工作原理感到困惑。我理解将数组作为参数传递给函数,例如 void foo(int a[5]) 将导致数组参数衰减为指针。在上面的两个问题链接中,我没有找到一个明确的答案,即为什么sizeof()函数本身不受(或至少看起来不受)这种指针衰减行为的影响。如果sizeof()的行为类似于任何其他函数,则 int a[5] = {1,2,3,4,5}; cout <<

我之前读过一个问题,由于与此完全相同,所以该问题被关闭

但读完这篇文章后,我仍然对sizeof()的工作原理感到困惑。我理解将数组作为参数传递给函数,例如

  void foo(int a[5])
将导致数组参数衰减为指针。在上面的两个问题链接中,我没有找到一个明确的答案,即为什么
sizeof()
函数本身不受(或至少看起来不受)这种指针衰减行为的影响。如果sizeof()的行为类似于任何其他函数,则

   int a[5] = {1,2,3,4,5};
   cout << sizeof(a) << endl;
inta[5]={1,2,3,4,5};

cout
sizeof
是一个运算符,而不是一个函数。这也是一个具体的问题。如果是表达式,甚至不需要括号:

int a;
sizeof (int); //needed because `int` is a type
sizeof a; //optional because `a` is an expression
sizeof (a); //^ also works 

正如你所看到的,它也在这张图表上。它也是一种不可重载的运算符。

因为标准上这么说(强调我的):

(C99,6.3.2.1p3)除非它是sizeof运算符的操作数或一元&运算符,或者是用于初始化数组的字符串文字,否则类型为“array of type”的表达式将转换为类型为“pointer to type”的表达式“它指向数组对象的初始元素,不是左值。”

注意,对于C++,标准明确地表示大小是数组的大小:

(C++11,5.3.3p2 sizeof)“[…]应用于数组时,结果是数组中的总字节数。这意味着数组的大小为n 元素的大小是元素大小的n倍。”


注意:
void-foo(int(&a)[5])
不会导致数组参数衰减。重要的是目标,而不是源。
void-foo(int-a[5])
——我真的希望参数表单被弃用,只有表单
void-foo(int*a)允许,它只会引起混乱。我不在乎谁的代码会被破坏。在C++中,规则稍微不同,它有另一种情况:当将数组表达式绑定到数组引用时,不会发生衰减。但是这些都是奇怪的事情。