在以下C++ 11代码中:
void f(int) {} void f(double) {} void (*p)(int) = f;
有两个功能.
第三个f
标识符是id-expression和初始化器p
.
在5.1.1p8 [expr.prim.general]/8中它说:
[id-expression]的类型是标识符的类型.结果是由标识符表示的实体.如果实体是函数,变量或数据成员,则结果是左值,否则为prvalue.
鉴于这f
可能是指具有两种不同类型的两个不同实体,则没有"实体"或"类型".
标准中是否还有其他一些文字可以解决这种情况?
实现只是将此歧义消除为扩展或是否需要在某处?(没有其他一些文本,人们可能会争辩说实现可能会拒绝f id-expression为含糊不清的.)
标准(见第13.4节)定义:
在某些上下文中,使用不带参数的重载函数名称解析为函数,指向函数的指针或指向来自重载集的特定函数的成员函数的指针.函数模板名称被认为是在这种上下文中命名一组重载函数.选择的函数是其类型与上下文中所需的目标类型的函数类型相同的函数.
强调我的.
在引用之后,有一个类似于你的例子(§13.4/ 5):
int f(double); int f(int); int (*pfd)(double) = &f; // selects f(double) int (*pfi)(int) = &f; // selects f(int)
就一元&
而言,该标准规定(§5.3.1/6并感谢jogojapan):
重载函数的地址只能在唯一确定引用过载函数版本的上下文中获取.
但也可以省略(见第13.4/1条):
重载的函数名称可以在&运算符之后.
(再次,强调我的)就像你所做的那样,在你的例子中.