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

我之前读过一个因为与此完全重复而被关闭的问题

当函数具有特定大小的数组参数时,为什么它被指针替换?

如何找到’sizeof’(指向数组的指针)?

但在阅读本文后,我仍然对sizeof()的工作方式感到困惑。 我理解将数组作为参数传递给函数,如

void foo(int a[5]) 

将导致数组参数衰减为指针。 我在上面的2个问题链接中没有找到的是一个明确的答案,为什么sizeof()函数本身免于(或至少看似豁免)这个指针衰减行为。 如果sizeof()表现得像任何其他函数那么

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

那么上面应该输出4而不是20 。 我是否错过了一些明显的东西,因为这似乎与指针行为的衰退相矛盾? 很抱歉再次提起这个问题,但我真的很难理解为什么会发生这种情况,尽管多年来一直很愉快地使用这个function而没有真正考虑它。

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

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

请注意,对于C ++,标准明确指出大小是数组的大小:

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

sizeof是一个运算符,而不是一个函数。 这也是一个特定的。 如果它是一个表达式,则括号甚至不是必需的:

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

正如您所看到的,它也在此优先级图表上。 它也是不可重载的运营商之一。