在以下C++11代码中:
void f(int) {}
void f(double) {}
void (*p)(int) = f;
有两个功能。
第三个f
标识符是id表达式和p
的初始值设定项。
在5.1.1p8[expr.prim.general]/8中,它说:
[id表达式]的类型就是标识符的类型。结果是由标识符表示的实体。如果实体是函数、变量或数据成员,则结果为左值,否则为prvalue。
假设f
可以指具有两种不同类型的两个不同实体,则不存在"实体"或"类型"。
标准中是否有其他文本可以解决这种情况?
实现只是将其作为一个扩展来消除歧义,还是在某个地方需要它?(如果没有其他文本,人们可能会认为实现可能会拒绝f id表达式,因为它不明确。)
标准(§13.4)定义:
在中解决了使用不带参数的重载函数名的问题函数的某些上下文、指向函数的指针或指向重载集中特定函数的成员函数。A.函数模板名称被认为是命名一组重载的在这种情况下发挥作用选择的函数类型与中所需的目标类型的函数类型相同上下文。
强调我的。
在引用之后,有一个类似于您的例子(见§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,感谢日本政府):
重载函数的地址只能在上下文中获取唯一确定重载函数的版本简称
但也可以省略(见§13.4/1):
重载函数名可以前面加上&操作人员
(再次强调我的)就像你在你的例子中所做的那样。