C ++ 11&C ++ 14中“bsearch”的规范是否有缺陷?
从我对这个问题的回答开始,在C ++ 11和C ++ 14中:
[C++11, C++14: 25.5/2]:
内容与标准C库头<stdlib.h>
,但有以下几点例外:
[C++11, C++14: 25.5/3]:
函数签名:bsearch(const void *, const void *, size_t, size_t, int (*)(const void *, const void *));
被两个声明所取代:
extern "C" void *bsearch(const void *key, const void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)); extern "C++" void *bsearch(const void *key, const void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));
这两者与原始声明具有相同的行为。
然而,
[C++11, C++14: 7.5/5]:
如果两个声明声明具有相同名称的函数和参数types列表(8.3.5)成为相同名称空间的成员或声明具有相同名称的对象成为同一名称空间的成员,并且声明给出不同的语言联系的名称,该程序是不合格的; 如果声明出现在不同的翻译单元中,则不需要进行诊断。 [..]
这是一个缺陷吗?
但参数types列表不一样。 其中之一是compar
是指向“C”语言连接的函数的指针, compar
是指向“C ++”语言连接的函数的指针。
C ++ 11,7.5指定:
1 …具有不同语言链接的两个函数types是不同的types,即使它们在其他方面是相同的。
4在连接规范中,指定的语言连接适用于所有function声明符的functiontypes,具有外部连接的function名称,以及在连接规范中声明的具有外部连接的variables名称。 [ 例如:
extern "C" void f1(void(*pf)(int)); // the name f1 and its function type have C language // linkage; pf is a pointer to a C function
7.5 / 1和7.5 / 5之间看似不一致的情况是在实现了1个函数types, 5个函数名称的情况下解决的。