为什么表达式 a() 和 (****&a)() 调用同一个函数?
Why expressions a() and (****&a)() call the same function?
有这样的代码:
void a() { }
int main(){
a();
(****&a)();
return 0;
}
为什么语句(****&a)();
和a();
具有相同的效果?
这都是因为函数到指针的转换(第4.3节):
函数类型为
T
的左值可以转换为"指向T
的指针"类型的右值,得到指向该函数的指针。
&a
首先给你一个指向a
的指针。然后用*
解引用它,得到函数本身。然后尝试对该函数解引用,但由于不能解引用,因此它将进行函数到指针的转换以再次获得指针。您可以使用*
来解引用该指针,等等。
最后,(****&a)
表示函数a
,您可以调用它,因为您可以将()
应用于函数,而无需进行函数到指针的转换。
相关文章:
- 为什么std::async使用同一个线程运行函数
- 是否可以使用非常量指针调用非常量函数,以及当两个unique_ptrs指向同一个对象时程序的行为方式?
- 如何将不同的函数签名映射到同一个 std::map?
- 如果两个线程调用同一个函数,但函数中的所有变量都是局部变量,我还需要担心线程之间共享数据吗?
- 两个单链列表共享同一个节点和析构函数两次删除相同的内存
- 有可能在同一个字符序列上有一个类似函数的宏和一个类似对象的宏吗
- 当调用来自同一个重载的非常量版本成员函数时,可以删除常量限定符吗
- 如何在同一个主文件中转发声明类似模板函数的模板类
- 如何在同一个类中同时具有参数化构造函数和默认构造函数
- 具有模板化成员函数的类,是同一个类
- C++ 结构函数体调用另一个结构函数,同一个模块
- 类成员函数调用类友元函数(都是同一个类)可能
- 为什么要将类的线程函数设置为静态,以便在同一个类中可以访问
- C++内联函数的定义必须在同一个文件中
- 如果基类和派生类都需要使用同一个函数,回调函数应该去哪里?
- 为什么表达式 a() 和 (****&a)() 调用同一个函数?
- c++在同一个函数中返回字符串引用和传递字符串引用
- c++: Boost::asio:在同一个函数中等待异步处理程序
- 两个或多个std::线程如何操作同一个函数
- 将两个维度大小不同的矩阵传递给同一个函数