【问题标题】:Does sizeof(function) makes sense?sizeof(function) 有意义吗?
【发布时间】:2018-11-25 20:48:07
【问题描述】:

我对@9​​87654322@ 有点困惑。我曾经认为sizeof 运算符对类对象、指针和引用进行操作

sizeof 运算符可以操作哪些操作数

sizeof(function) 有意义吗?

【问题讨论】:

  • 显示minimal reproducible example。你试过sizeof(function)吗?如果它意味着我猜它应该的意思,它甚至不会编译,因为它不是合法的 C++。

标签: c++ function c++11 language-lawyer sizeof


【解决方案1】:

根据:http://en.cppreference.com/w/cpp/language/sizeof

"...sizeof 不能与函数类型、不完整类型或 位域glvalues"

或来自http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf 的 2012 年 C++ 标准工作草案:

第 5.3.3 节 Sizeof "sizeof 运算符不应应用于具有 函数或不完整类型,到其底层的枚举类型 在声明所有枚举数之前,类型不固定,以 此类类型的括号名称,或指定的左值 一个位域。”

【讨论】:

  • 还有一个更权威的理由是引用一些 C++ 标准,比如n3337
  • Cheers Basile - 已添加。
【解决方案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 节)部分中说明

  1. sizeof 运算符不得应用于具有 函数不完整类型,到一个枚举类型,其底层 在声明所有枚举数之前,类型不固定,以 此类类型的带括号的名称,或左值 指定一个位域。
  2. sizeof 运算符可以应用于指向函数的指针,但是 不应直接应用于函数
  3. lvalue-to-rvaluearray-to-pointerfunction-to-pointer 标准转换不适用于sizeof 的操作数。
  4. 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++ 模式。

    【讨论】:

      猜你喜欢
      • 2021-12-04
      • 1970-01-01
      • 2019-03-12
      • 1970-01-01
      • 2010-11-09
      • 2014-08-07
      相关资源
      最近更新 更多