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