【问题标题】:Does sizeof(function) makes sense?sizeof(function) 有意义吗?
【发布时间】:2018-11-25 20:48:07
【问题描述】:
我对@987654322@ 有点困惑。我曾经认为sizeof 运算符对类对象、指针和引用进行操作。
sizeof 运算符可以操作哪些操作数?
sizeof(function) 有意义吗?
【问题讨论】:
标签:
c++
function
c++11
language-lawyer
sizeof
【解决方案1】:
【讨论】:
-
还有一个更权威的理由是引用一些 C++ 标准,比如n3337
-
【解决方案2】:
> sizeof 运算符在 C++ 中可以操作哪些操作数?
来自C++11 ISO Standerds(N3337 草案,第 105 页,第 5.3.3 节)
sizeof 运算符产生对象中的字节数
其操作数的表示。操作数要么是表达式,要么
这是一个未计算的操作数(第 5 条),
或带括号的 type-id。 (第 5 条 (N3337 草案,第 83 页)))
> sizeof(function) 有意义吗?
在文档中的 8.5.2.3/(草案 N3337,第 105 页,第 5.3.3 节)部分中说明:
-
sizeof 运算符不得应用于具有
函数或不完整类型,到一个枚举类型,其底层
在声明所有枚举数之前,类型不固定,以
此类类型的带括号的名称,或左值
指定一个位域。
- sizeof 运算符可以应用于指向函数的指针,但是
不应直接应用于函数。
-
lvalue-to-rvalue 、 array-to-pointer 和 function-to-pointer 标准转换不适用于
sizeof 的操作数。
-
sizeof(char)、sizeof(signed char) 和 sizeof(unsigned char)
是 1. 应用于任何其他 fundamental type
(3.9.1) 的 sizeof 的结果是实现定义的。
【解决方案3】:
虽然sizeof(func) 是无效的,正如 Avi Weiss 和 JeJo 的回答中正确指出的那样,但如果你尝试它,你不一定会得到错误。
在 GNU C 中,sizeof(void) 和 sizeof(func) 被允许作为扩展名并计算为 1。This is a documented extension. 按照标准的要求,您会收到警告,但不会出错。此扩展也可用于 C++ 模式。