C2x,6.5.3.2 地址和间接运算符,约束,2:
一元 * 运算符的操作数应具有指针类型。
为什么没有约束“操作数不应是指向void
”的指针?
虽然可以推导出来:
C2x,6.5.3.2 地址和间接运算符,语义,4:
一元 * 运算符表示间接。如果操作数指向一个函数,则结果是一个函数指示符;如果它指向一个对象,则结果是一个指定该对象的左值。
C2x,6.3.2.1 左值、数组和函数指示符,1:
左值是一个表达式(对象类型不是 void),它可能指定一个对象;...
C2x,6.5.3.2 地址和间接运算符,约束,2:
一元 * 运算符的操作数应具有指针类型。
为什么没有约束“操作数不应是指向void
”的指针?
虽然可以推导出来:
C2x,6.5.3.2 地址和间接运算符,语义,4:
一元 * 运算符表示间接。如果操作数指向一个函数,则结果是一个函数指示符;如果它指向一个对象,则结果是一个指定该对象的左值。
C2x,6.3.2.1 左值、数组和函数指示符,1:
左值是一个表达式(对象类型不是 void),它可能指定一个对象;...
一种可能的情况(虽然有点做作,我承认)添加“建议”约束会破坏代码的情况是&
和*
运算符连接的地方。在这种情况下,允许使用诸如a = &*p
, where p
is a void*
type之类的表达式。
在此标准草案中,紧随您第一次引用中的部分(粗体强调我的):
语义
3 一元运算&
符产生其操作数的地址。如果操作数的类型为“type”,则结果的类型为“pointer to type”。如果操作数是一元运算符的结果,则该运算*
符和该&
运算符都不会被计算 并且结果就像两者都被省略了,除了对运算符的约束仍然适用并且结果不是左值。…</p>
目前,我无法想到该&*
组合的用例(在一个void*
或任何其他指针类型上)——但它可能发生在“自动生成”和/或使用条件宏扩展的代码中。