Подтвердить что ты не робот

Является ли спецификация `bsearch` в С++ 11 и С++ 14 дефектной?

Следуя моему ответу на этот вопрос, как в С++ 11, так и в С++ 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]: Если два объявления объявляют функции с тем же именем и списком параметров (8.3.5), которые являются членами одного и того же пространства имен или объявляют объекты с тем же именем членами одного и того же пространства имен и деклараций дать названиям разные языковые связи, программа плохо сформирована; никакая диагностика не требуется, если декларации появляются в разных единицах перевода. [..]

Является ли это дефектом?

4b9b3361

Ответ 1

Но список типов параметров не совпадает. В одном, compar является указателем на функцию с языковой связью "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

Похожая несогласованность между 7.5/1 и 7.5/5 решается при реализации того, что 1 говорит о типах функций, а 5 имен функций функций.