获取函数的地址?

getting the address of the function?

本文关键字:地址 函数 获取      更新时间:2023-10-16

我正在编写这段代码,打印下面的这一行显示了地址,这怎么可能?

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

获取函数的地址?

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

在下面打印这一行向我显示地址,这怎么可能?

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

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

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

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

#include <iostream>
namespace {
struct back {
static const int y = 7;
static int f(int i = 0) {
return i / 2;
}
};
std::ostream& operator<<(std::ostream& out, decltype(back::f)) {
out << "baby ducks";
return out;
}
} // anon
int main() {
std::cout << back::f << "n"; // Output: baby ducks
}

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