c++ - 存储函数指针的正确语法
问题描述
令人惊讶的是,无论在函数名之前使用什么符号,以下代码在 gcc 和 clang 中都能很好地编译:*
,&
或者什么也不做。标准是否允许其中任何一个?存储函数指针的首选方式是什么?
#include <stdio.h>
typedef int foo(int a);
template <typename X>
int g(int y) {
return y * sizeof(X);
}
int main() {
foo* xxx;
// 1. what is correct according to standard?
// 2. why they all work?
xxx = *g<float>;
xxx = &g<float>;
xxx = g<float>;
printf("ok %d\n", xxx(5));
}
解决方案
一切都应该正常工作并且在这里具有相同的效果。首选哪一个是样式问题,IMO 代码中的第一个令人困惑,其他两个是相当常见的用法。
为方便起见,我将按照您的代码的相反顺序进行解释,
对于
xxx = g<float>;
,函数到指针的隐式转换是从 执行的g<float>
,转换后的指针分配给xxx
。对于
xxx = &g<float>;
,operator&
显式用于获取函数的地址,返回的指针分配给xxx
。对于
xxx = *g<float>;
,函数到指针的隐式转换是从 执行的g<float>
,然后指针被取消引用operator*
,它返回一个函数引用,在该函数引用上执行函数到指针的隐式转换(再次),转换后的指针最后被分配给xxx
。
推荐阅读
- c++ - 在 C++ 中尝试 jaeger opentracing 时,不使用“-L /usr/local/lib”进行编译会产生“无法连接到套接字”错误
- mysql - 当表单在 node.js 中设置为 enctype="multipart/form-data" 时,我们如何在 MySQL 中发送数据?
- java - 如何在 log4j2 插件中通过 websocket 发送消息?
- android - 使用 Cloud Firestore 中的数据在 Android 应用中初始化 SwipeStack
- firebase - Firebase 消息传递获取云函数名称
- c# - json将项目反序列化为字符串格式c#
- android - 在 rcecycler 视图中从 Android Studio 中的 Firebase 检索具体数据
- python - 分割段落文本并计算平均字数
- python - 导入错误:无法导入名称“statfunc”(已安装 pymc3 模块)
- sql-server - MS-SQL 获取特定于案例的值