Какова цель extern C AND С++ для одной функции (bsearch/qsort)?

При просмотре черновика стандарта (N4527) я нашел следующий абзац ([alg.c.library]):

Подпись функции:

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*));

И тот же материал для qsort.

Я также нашел в [dcl.link]:

Если два объявления объявляют функции с тем же именем и списком параметров (8.3.5), которые являются членами одного и того же пространства имен или объявляют объекты с тем же именем членами одного и того же пространства имен, а декларации дают имена различные языковые связи, программа плохо сформирована;

Какова цель этих двух extern объявлений одной и той же функции? Почему этот блок не плохо сформирован?

Ответы

Ответ 1

Списки типов параметров не совпадают. В самом деле. Я не шучу. Два аргумента compar имеют разные типы: в первом объявлении, поскольку функция extern "C", функция compar также extern "C"; во втором, функция compar extern C++". И поэтому есть два объявления: чтобы вы могли называть bsearch функциями с языковой связью.