C++ 11和C++ 14中`bsearch`的规范是否有缺陷?

Lig*_*ica 45 c++ language-lawyer 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 *));
Run Code Online (Sandbox Code Playgroud)

被两个声明取代:

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 *));
Run Code Online (Sandbox Code Playgroud)

两者都具有与原始声明相同的行为.

然而,

[C++11, C++14: 7.5/5]:如果两个声明声明具有相同名称的函数,并且参数类型列表(8.3.5)是同一命名空间的成员,或者声明具有相同名称的对象是同一命名空间的成员,并且声明为这些名称提供不同的语言链接,该计划是不正常的; 如果声明出现在不同的翻译单元中,则无需诊断.[..]

这是一个缺陷吗?

Rei*_*ica 49

但参数类型列表不一样.在一个中,compar是指向具有"C"语言链接的函数的指针,在另一个中,它是指向具有"C++"语言链接的函数的指针.

C++ 11,7.5规定:

1 ...具有不同语言联系的两种函数类型是不同的类型,即使它们在其他方面是相同的.

4在链接规范中,指定的语言链接适用于所有函数声明符的函数类型,具有外部链接的函数名称,以及在链接规范中声明的具有外部链接的变量名称.[ 例如:

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
Run Code Online (Sandbox Code Playgroud)

当实现1讨论函数类型时, 7.5/1和7.5/5之间看似不一致,而5解决函数名称.

  • 好吧,如果他们无法区分关联类型,他们别无选择.所以,一个bug并充分利用它. (5认同)
  • 似乎clang ++和g ++都认为它们不同.http://coliru.stacked-crooked.com/a/ceb69c605e32832d (4认同)
  • 啊哈! (3认同)