c++ c++11 language-lawyer c++14 bsearch

¿La especificación de `bsearch` en C++ 11 y C++ 14 es defectuosa?



c++11 language-lawyer (1)

Pero la lista de tipos de parámetros no es la misma. En uno, compar es un puntero a una función con enlace de lenguaje "C", en el otro, es un puntero a una función con enlace de lenguaje "C ++".

C ++ 11, 7.5 especifica:

1 ... Dos tipos de funciones con enlaces de idiomas diferentes son tipos distintos, incluso si son idénticos.

4 En una especificación de vinculación, la vinculación de idioma especificada se aplica a los tipos de funciones de todos los declaradores de funciones, nombres de funciones con enlaces externos y nombres de variables con enlaces externos declarados dentro de la especificación de vinculación. [ Ejemplo:

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

La aparente inconsistencia entre 7.5 / 1 y 7.5 / 5 se resuelve al darse cuenta de que 1 habla sobre tipos de funciones , mientras que 5 direcciones de nombres de funciones .

A continuación de mi respuesta a esta pregunta , tanto en C ++ 11 como en C ++ 14:

[C++11, C++14: 25.5/2]: el contenido es el mismo que el del encabezado de biblioteca estándar C <stdlib.h> con las siguientes excepciones:

[C++11, C++14: 25.5/3]: la firma de la función:

bsearch(const void *, const void *, size_t, size_t, int (*)(const void *, const void *));

es reemplazado por las dos declaraciones:

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

ambos tienen el mismo comportamiento que la declaración original.

Sin embargo,

[C++11, C++14: 7.5/5]: si dos declaraciones declaran funciones con el mismo nombre y parameter-type-list (8.3.5) para ser miembros del mismo espacio de nombres o declarar objetos con el mismo nombre ser miembros del mismo espacio de nombres y las declaraciones dan a los nombres diferentes enlaces de idiomas, el programa está mal formado; no se requiere diagnóstico si las declaraciones aparecen en diferentes unidades de traducción. [..]

¿Es esto un defecto?