gpt4 book ai didi

c++ - C 中的函数指针 - 地址运算符 "unnecessary"

转载 作者:可可西里 更新时间:2023-11-01 18:06:32 26 4
gpt4 key购买 nike

在 C 中使用 qsort,我们传入一个比较函数,例如

int cmp(const void*, const void*);

qsort 的原型(prototype)需要一个 int (* )(const void* , const void*) 所以我们调用:

qsort(..., cmp);

但调用同样有效:

qsort(..., &cmp);

如果我们在 C++ 中传递一个静态成员函数,这就是我们必须做的。 Kernighan & Ritchie(第 2 版,5.11“函数指针”p119)指出“由于已知 [cmp] 是一个函数,因此不需要 & 运算符,就像在数组名称之前不需要它一样。 "

有没有其他人对此感到有点不舒服(尤其是关于类型安全)?

最佳答案

嗯,答案是按值传递函数会产生一个函数指针,就像按值传递数组会产生指向其第一个元素的指针一样。有人说数组和函数“衰减”。只有少数情况不会发生这种衰减。例如 sizeof(array) 产生数组的大小,而不是它的第一个元素指针。 sizeof(function) 无效(函数不是对象),你必须执行 sizeof(&function)。其他场合绑定(bind)引用:

void baz();

void foo(void (&bar)()) {
bar();
}

// doesnt work, since a reference to a function is requested.
// you have to pass 'bar' itself, without taking its address
// explicitely.
foo(&baz);

顺便说一句,这就是你可以做的原因

template<typename T, int N>
void ByRef(T (&foo)[N]) {
...
}

因为在考虑引用参数时阵列还没有衰减。

关于c++ - C 中的函数指针 - 地址运算符 "unnecessary",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/258422/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com