Исходя из моего ответа на этот вопрос, как в C ++ 11, так и в C ++ 14:
[C++11, C++14: 25.5/2]:
Содержимое совпадает с заголовком библиотеки Standard 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) как члены одного и того же пространства имен, или объявляют объекты с одним и тем же именем как члены одного и того же пространства имен, и объявления дают именам разные языковые связи программа плохо сформирована; Диагностика не требуется, если объявления появляются в разных единицах перевода. [..]
Это дефект?
Но список типов параметров не совпадает. В одной, 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
Кажущееся несоответствие между 7.5 / 1 и 7.5 / 5 решается, когда понимаешь, что 1 говорит о функции типы, в то время как функция 5 адресов имена.