¿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?