为什么typeid on function是正常的,而sizeof则没有

时间:2015-01-08 22:52:47

标签: c++ function syntax sizeof typeid

在发现这个时,在C ++中鬼混:

#include <iostream>
#include <typeinfo>
#include <boost/core/demangle.hpp>

int main(int argc, char *argv[]) {
    using namespace std;
    using boost::core::demangle;

    cout 
        << demangle(typeid(void()).name()) << endl // ok so far
        << sizeof(void()) << endl; // error here: invalid application of 'sizeof' to a function type
}

我无法理解为什么我可以得到函数类型的type_info,但不能得到它的大小。
关于C ++如何看待函数的一些上下文可能会有所帮助。

2 个答案:

答案 0 :(得分:6)

主要原因很简单:在C ++中,函数有一个类型,但它没有大小。请记住,在C ++中,某些内容的大小是您必须添加到指针以获取表中下一个元素的字节数。由于您无法将函数放在表中,因此它们没有大小。

答案 1 :(得分:0)

  

[C++11: 5.3.3/1]: sizeof运算符产生其操作数的对象表示中的字节数。操作数是表达式,它是未评估的操作数(第5条),或带括号的 type-id sizeof运算符不应该应用于具有函数或类型不完整的表达式,也不应用于在声明所有枚举数之前其基础类型未修复的枚举类型到带括号的名称这些类型,或指定位域的左值。 sizeof(char)sizeof(signed char)sizeof(unsigned char)1sizeof应用于任何其他基本类型(3.9.1)的结果是实现定义的。 [..]

这根本没有意义; sizeof通过一段数据测量内存中占用的空间:变量或常量,其值可以读取。但是一个函数不是一个数据,它没有大小。

程序代码本身占用的内存量,虽然程序 在运行时加载到内存中,但程序中的任何语言功能都不会考虑这些内存。

函数具有类型的事实是不相关的!上述引用也意味着sizeof(void)无效。

但请注意:

  

[C++11: 5.3.3/3]: sizeof运算符可以应用于指向函数的指针,但不能直接应用于函数。

......我认为这是相关的,虽然不是特别有趣。