如果有多种可能性,C++ 编译器如何决定调用哪个函数/方法?在我的具体情况下,我有 C++ 运行时的标准免费功能,我还有一个模板化的免费变体,如下所示:
// The definitions of the C++ Run Time Library (from memory.h)
extern malloc(size_t s);
extern void free(void *p);
// Our own memory management functions
extern void *OurMalloc(size_t s);
extern void OurFree(void *p);
// Own variants to overrule malloc and free (instead of using #define)
template<typename T>
void *malloc(T t)
{
return OurMalloc(t);
}
template<typename T>
void free(T *t)
{
OurFree(t);
}
我使用以下代码对此进行了测试:
void main(void)
{
void *p = malloc(10);
free(p);
}
如果我编译并运行它,似乎对 malloc 的调用被模板化变体正确替换。到现在为止还挺好。
但是,对 free 的调用并没有被模板化的变体取代,并且仍然调用了标准的 C++ 函数。
C++ 编译器使用什么规则来决定优先考虑哪个变体?这与 Koenig 查找规则有关吗?
注意:我尝试了这种替代方法,因为使用 #define 不能解决问题(请参阅问题如何使用 C 宏 (#define) 来更改调用而不是原型)。