如果从C ++ FAQ精简版以下为真:“函数名衰变到的指针功能”(作为数组名称衰变到一个指针到它的第一个元素);为什么我们必须包含符号?

typedef  int (Fred::*FredMemFn)(char x, float y);
FredMemFn p = &Fred::f;

和不只是:

typedef  int (Fred::*FredMemFn)(char x, float y);
FredMemFn p = Fred::f;

在第二种情况下佛瑞德:: f是一个功能,并且可以衰减到一个指向功能。

我希望这个问题不是笨

有帮助吗?

解决方案

原来的答复:

,因为成员函数不是一个函数和成员函数指针不是一个函数指针。因此衰减的规则不适用。

此外,有一个在C ++函数类型,但不是成员函数类型。所以,你可以使用在一个指针到功能有望地方的功能,但因为没有这样的事情,只有指针到成员函数,你不能使用成员函数。 F IN:你的例子是一个函数。在另一方面,弗雷德:: f是......嗯,什么都没有。

此外,我认为,“一个函数可以衰减的名称...”。否,名称不能做任何事情,功能类型的左值可以隐式转换到一个指针到功能,这就是,只要过载分辨率而言的标识转换

编辑澄清我的回答:

在C ++每个表达式具有类型和值。一种类型的值可以偶尔被转换为另一种类型的值。这些转换排名,这样做一个转换更好的是另外一个主要的函数重载解析。

一类型的转化的被称为左值到右值转换。当左值出现在其中一个rvalue需要此转换的上下文发生。一般这种转换不执行任何操作,例如:

int i = 4, j = 5;
i = j;

在第二行j是一个左值,但这里需要一个rvalue,所以j被转换为右值。但是,这不是一个观察的转换,是什么呢?但也有地方可以观察到左值到右值的转换情况。即,<强> 的T N阵列的一个左值可以被转换成类型T*其值的右值是数组的第一元素的地址 和<强> < EM>型类型的右值的“与签名S功能”左值“指向与签名S功能”,它的值是该函数的地址

这意味着,当我们指定功能的指针到功能的功能左值是隐式转换为它的地址。

void f() {}
void (*p) () = f; //f is converted to rvalue

f是一个表达,并具有一个类型。 F公司类型是void()

有作为member-function没有这样的类型在C ++ 的 有指针到成员函数,而不是成员函数本身。我说当然有关非静态功能。静态功能的工作方式相同的普通函数,也就是说,你不必写&X::f,而不是你可以写X::f 为什么?由于X :: f有一个类型的功能和上述转换发生。如果f是非静态,然而,X :: f是类型......什么?噢,它不具有一个类型,因此不表达,并且因此不具有值,因此该值不能被转换到任何东西。

引用从标准:5.3.1第3 当使用显式&仅形成一个指向构件和它的操作数是一个合格的-ID不包含在括号中。 [注:即,表达(合格-ID),其中,所述合格-ID被用括号括起来,不形成类型的表达式“指针构件。”同样没有合格-ID,因为没有隐式转换一个合格的-ID用于非静态成员函数的类型为“成员函数指针”,因为是从功能类型的类型“指针功能”的左值(4.3)。也不是&不合格-ID的指针构件,甚至的范围内 不合格-ID的类。 ]

希望这是更清晰...

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top