Является ли спецификация `bsearch` в C ++ 11 & amp; C ++ 14 неисправен?

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

Это дефект?

45

Решение

Но список типов параметров не совпадает. В одной, 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 адресов имена.

49

Другие решения