首页 > 解决方案 > 存储函数指针的正确语法

问题描述

令人惊讶的是,无论在函数名之前使用什么符号,以下代码在 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));
}

标签: c++function-pointersimplicit-conversion

解决方案


一切都应该正常工作并且在这里具有相同的效果。首选哪一个是样式问题,IMO 代码中的第一个令人困惑,其他两个是相当常见的用法。

为方便起见,我将按照您的代码的相反顺序进行解释,

  1. 对于xxx = g<float>;函数到指针的隐式转换是从 执行的g<float>,转换后的指针分配给xxx

  2. 对于xxx = &g<float>;,operator&显式用于获取函数的地址,返回的指针分配给xxx

  3. 对于xxx = *g<float>;,函数到指针的隐式转换是从 执行的g<float>,然后指针被取消引用operator*,它返回一个函数引用,在该函数引用上执行函数到指针的隐式转换(再次),转换后的指针最后被分配给xxx


推荐阅读