为什么无法引用void?我在C++标准中找到的唯一内容就是这一行,见8.3.2.1
指定类型"对cv void的引用"的声明符是不正确的.
为什么会那样?为什么我不能写一个接受一个"通用"的函数void&
?
为了清楚起见,我没有任何有用的应用程序,使用引用void可能比使用模板更好,但我只是好奇禁止这个结构的基本原理.
为了澄清一点,我理解使用"按原样"引用"无效"将与取消引用指向void的指针一样毫无意义.不过,我可以把它转换为参考TO- sometype.这时候为了使用它,我能不能?事实上,我不明白为什么下面的代码片段可以工作......
void foo(void *data) { int *i = reinterpret_cast(data); // do something with i }
......虽然这个不能:
void foo(void &data) { int &i = reinterpret_cast(data); // do something with i }
David Thornl.. 39
如果你确实提到了void,你会用它做什么?它不是数字,字符,指针或类似的东西.您的假设通用函数无法对其执行任何操作,除了获取其地址(而不是其大小).
"void"有两个用途:放弃任何类型的知识(如void*),并指定任何东西而不是某些东西(void函数返回).在这两种情况下都不可能对某个空白说些什么,除了它可能有一个地址.
如果你想不出某种方式可以有用,而我却做不到,那至少证明某些东西是无用的,而这可能至少是这里理论的一部分.
如果你确实提到了void,你会用它做什么?它不是数字,字符,指针或类似的东西.您的假设通用函数无法对其执行任何操作,除了获取其地址(而不是其大小).
"void"有两个用途:放弃任何类型的知识(如void*),并指定任何东西而不是某些东西(void函数返回).在这两种情况下都不可能对某个空白说些什么,除了它可能有一个地址.
如果你想不出某种方式可以有用,而我却做不到,那至少证明某些东西是无用的,而这可能至少是这里理论的一部分.
首先问问你自己,你将如何取消引用无效指针?
void *p = /*something*/ ; cout << *p << endl;
上面的代码没有意义,我们无效的原因之一是我们可以说"我需要在这里做一些通用指针工作,我既不知道也不关心我指向的是什么".根据定义,编译器不知道void*指向什么,因此它不能取消引用它.你可以 - 通过强制转换 - 但编译器不能.
对void的引用会受到同一问题的影响,根据定义,指向的数据没有类型,因此无法以任何有意义的方式引用它.
要引用它 - 程序员 - 需要将其转换为其他类型,然后您可以对其进行类型化引用.
不确定我是否也像我想的那样解释了这一点.
鲁本,有什么想法吗?
编辑:回答你的编辑.
采取第一个函数,您传递void*data.数据是一个完全有效的项目,您可以使用它进行计算,或者如果您实施了一些日志记录,则可以记录它.
logger << data;
并且您将获得地址数据指向.如果您尝试取消引用数据,编译器将给您一个错误(暂时没有C++编译器,所以不确定实际错误).例如
void* data = /* some assignment */; logger << *data; // compiler error.
现在,编译器不会因为任何原因而让你取消引用void*(它没有意义),同样代表对void和data的引用,除了因为它是一个引用它一直被隐式取消引用.编译器不允许您在一次操作中取消引用void*,它不会让您不断地取消引用它.
void& data = /* some assignment *.; logger << data; // means same as logger << *data above
你不能对数据做任何事情除了拿它的地址,并且有一个完美的 - 安全 - 方法内置到语言中去做,即
void* data;
这有什么意义吗?
引用是对某事物实例的引用.某事物的实例不可能是一种类型void
.某些事物的实例必须具有特定类型(可能还有基类型).