获取功能的地址?

时间:2020-06-01 16:51:29

标签: c++

我正在编写此代码,并在下面打印此行,向我显示地址,那怎么可能?

struct back
{
    static const int y = 7;
    static int f(int i = 0)
    {
        return i / 2;
    }
};
std::cout << back::f;      // 003A143D

2 个答案:

答案 0 :(得分:2)

获取函数的地址?

您可以使用运算符&的地址获取函数的地址。结果(非静态成员函数除外)是指向函数的指针。在左值到右值转换之前,函数左值可以隐式转换为指向函数的指针。这种隐式转换称为衰减。

在下面打印此行会告诉我地址​​,那怎么可能?

由于某些语言扩展,这可能是可能的。该标准未指定用于将函数指针插入字符流的重载。符合标准的行为是打印1,因为函数指针隐式转换为确实具有流插入重载的bool,并且函数的地址永远不会为null。

这绝不是预期的行为,这就是为什么高质量的编译器会在函数衰减到指针时默认发出警告的原因。

答案 1 :(得分:1)

从eerorika的响应来看,类静态函数地址的打印似乎是偶然的,而不是标准的。

如果愿意,您可以覆盖行为。例如,

<<

警告(来自评论部分):为int(int)重载rm bitbake.lock 并不是一个好主意,因为不涉及用户定义的类型。