3

C2x,6.5.3.2 地址和间接运算符,约束,2:

一元 * 运算符的操作数应具有指针类型。

为什么没有约束“操作数不应是指向void”的指针?


虽然可以推导出来:

C2x,6.5.3.2 地址和间接运算符,语义,4:

元 * 运算符表示间接。如果操作数指向一个函数,则结果是一个函数指示符;如果它指向一个对象,则结果是一个指定该对象的左值。

C2x,6.3.2.1 左值、数组和函数指示符,1:

左值是一个表达式(对象类型不是 void),它可能指定一个对象;...

4

1 回答 1

4

一种可能的情况(虽然有点做作,我承认)添加“建议”约束会破坏代码的情况是&*运算符连接的地方。在这种情况下,允许使用诸如a = &*p, where pis a void*type之类的表达式。

此标准草案中紧随您第一次引用中的部分(粗体强调我的):

语义
3 一元运算&符产生其操作数的地址。如果操作数的类型为“type”,则结果的类型为“pointer to type”。如果操作数是一元运算符的结果,则该运算* 符和该&运算符都不会被计算 并且结果就像两者都被省略了,除了对运算符的约束仍然适用并且结果不是左值。…</p>

目前,我无法想到该&*组合的用例(在一个void*或任何其他指针类型上)——但它可能发生在“自动生成”和/或使用条件宏扩展的代码中。

于 2022-02-07T17:02:08.873 回答