C++ 关于函数转换指针的澄清

C++ 关于函数转换指针的澄清,c++,function-pointers,C++,Function Pointers,函数类型(左值)可以转换为函数指针(右值) 但从(4.1/1) 可以转换非函数、非数组类型T的左值(3.10) 到右值 这是否意味着没有对函数进行左值到右值的转换?另外,当数组衰减为指针时,它不返回一个作为指针的右值吗?函数是左值。指向函数(数据类型)的指针可以是 任何一个如果你给它起个名字,它就是左值;否则就不是了 (粗略地说)。指向函数的指针遵循所有常用的左值 要更改值转换规则,请执行以下操作。对于简单类型,如基本类型或 指针,从左值到右值的转换基本上意味着读取 变数 void func()

函数类型(左值)可以转换为函数指针(右值)

但从(4.1/1)

可以转换非函数、非数组类型T的左值(3.10) 到右值


这是否意味着没有对函数进行左值到右值的转换?另外,当数组衰减为指针时,它不返回一个作为指针的右值吗?

函数是左值。指向函数(数据类型)的指针可以是 任何一个如果你给它起个名字,它就是左值;否则就不是了 (粗略地说)。指向函数的指针遵循所有常用的左值 要更改值转换规则,请执行以下操作。对于简单类型,如基本类型或 指针,从左值到右值的转换基本上意味着读取 变数

void func();            //  Declares func
(*(&func))();           //  The expression &func is an rvalue
void (*pf)() = &func;   //  pf is an lvalue
(*pf)();                //  In the expression *pf, pf undergoes an
                        //  lvalue to rvalue conversion
请注意,函数有一个隐式转换为指向的指针 函数,并且
()
运算符对函数和 指向函数的指针,因此可以写入最后两行:

void (*pf)() = func;
pf();
与往常一样,转换的结果是右值(除非 转换为引用类型)。当数组 隐式转换为指针;数组和函数只能 作为左值存在,但它们都隐式转换为指针, 这是一个右值。但该指针可用于初始化
适当指针类型的变量;这些变量是左值

我明白了,所以结果只是一个地址,这并不意味着你的阅读有价值。对吧?结果是什么?将函数转换为指针的结果是一个值,即函数的地址。它在内存中没有地址(这是左值的一个特征)。函数
func
的结果是一个右值,它是一个地址,但不是从非函数或非数组类型返回的右值,这就是(4.1/1)中的语句的原因,对吗?@user1086635关于§4.1,它只说明函数或数组没有左值到右值的转换。它没有提到其他转换,例如数组到指针或函数到指针(其结果是右值,因为转换的目标类型不是引用)。@user1086635我不太愿意这样描述它,但它很接近。显式使用
&
运算符就是获取函数的地址:
&
运算符的操作数必须是左值,结果必须是右值。隐式转换是一种转换,而不是
&
运算符。但是转换的结果是一个右值,转换的语义与使用
&
操作符相同。所以在实践中,引擎盖下发生的事情实际上没有区别。
void (*pf)() = func;
pf();