C++ 是C+中'bsearch'的规范+;十一,;C++;14有缺陷吗?

C++ 是C+中'bsearch'的规范+;十一,;C++;14有缺陷吗?,c++,c++11,language-lawyer,c++14,bsearch,C++,C++11,Language Lawyer,C++14,Bsearch,以下是我在C++11和C++14中对的回答: [C++11,C++14:25.5/2]:内容与标准C库标题相同,但以下例外: [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

以下是我在C++11和C++14中对的回答:

[C++11,C++14:25.5/2]:
内容与标准C库标题
相同,但以下例外:

[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]:
如果两个声明将具有相同名称和参数类型列表(8.3.5)的函数声明为相同名称空间的成员,或者将具有相同名称的对象声明为相同名称空间的成员,并且声明给出了不同的语言链接,则程序的格式不正确;如果声明出现在不同的翻译单元中,则不需要进行诊断。[……]


这是一个缺陷吗?

但是参数类型列表不同。其中,
compar
是指向具有“C”语言链接的函数的指针,另一个是指向具有“C++”语言链接的函数的指针

C++11,7.5规定:

1。。。两种不同语言的函数类型 链接是不同的类型,即使它们在其他方面是相同的

4在链接规范中,指定的语言链接适用于函数 所有函数声明符的类型、具有外部链接的函数名和具有外部链接的变量名 悬挂机构规范中声明的悬挂机构。[示例:


7.5/1和7.5/5之间看似不一致的问题在意识到1谈论函数类型,而5谈论函数名称时得到了解决。

答案取决于这两个函数是否具有相同的参数。如果链接是类型的一部分,
compar
在两个示例中都有不同的类型……尽管如果是,我想要一些eaSY方式声明它的类型,我不知道任何。@标准副本中的DeDeCopter,你可以使用模板别名。<代码>模板使用CXXFUNC= R(t);使用C++的模板“C”{ R(t…)};。将
compar
声明为
CFunc
cxfunc
。大多数实现都拒绝它,因为它们不允许在
extern“C”
块中使用模板,但它是完全有效的。限制是模板不能有
extern“C”
链接,而不是模板不能出现在
extern“C”块中
block。模板别名没有语言链接,所以可以。这与C++98 25.4/3中的方法相同(对于
qsort
,为25.4/4)有没有一种简单的方法来声明第一个FP有C++和第二个C链接,对于函数有两个函数指针?@去重复器使用一个<代码> TyBuffs<代码>不同于包含函数的语言链接。它们无法区分链接上的类型。因此,一个bug并充分利用它。@雅克记不住函数类型语言链接是一个明确的一致性问题,对此毫无疑问。是的,当你指向任何标准库函数时,你不能假设任何特定的语言链接。你可能会得到一个带有C l的函数墨水,或者一个带有C++链接的函数,唯一的方法是在上下文中工作(<代码> DECKECTON/CODE >,<代码> Audio<代码>,或导出的模板参数)。
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