compile c++ templates gcc clang const

c++ - compile - Comportamiento diferente del compilador al aplicar un calificador const a un argumento de plantilla



clang windows (1)

Parece que tocas un defecto en el estándar que aún no se ha resuelto. Entonces, la respuesta a "¿Qué compilador es el correcto?" no estaría del todo claro actualmente.

El problema ha sido planteado y discutido por el comité:

No está claro si lo siguiente está bien formado o no:

void foo(){} template<class T> void deduce(const T*) { } int main() { deduce(foo); }

Las implementaciones varían en su tratamiento de este ejemplo.

vea http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1584 , pero la resolución propuesta no es parte de N4141 o N4659.

Tenga en cuenta que generalmente no puede tener punteros para const tipos de funciones; si considera el ejemplo que cité mal formado, gcc sería correcto. Rechaza el ejemplo y, en el OP, escoge la versión no const como la única sobrecarga viable.

Si clang (que pretende implementar la resolución propuesta ) estaría bien, de lo contrario, no estoy seguro. Supongo que tendríamos que volver a la discusión una vez que el comité haya resuelto el problema con una redacción normativa que podamos usar.

Sin embargo,

El consenso de CWG fue que la calificación cv del argumento y parámetro debe coincidir, por lo que el ejemplo original debe ser rechazado.

(nota a dicho problema) parece indicar que gcc es correcto y el problema se resolverá a favor de su comportamiento.

Considera el siguiente ejemplo ( godbolt ):

#include <iostream> template <typename T> const T *as_const(T *p) { return p; } void f() {} template <typename T> void g(T *) { std::cout << "A"; } template <typename T> void g(const T *) { std::cout << "B"; } int main() { g(as_const(&f)); }

Tanto GCC como Clang pueden compilarlo, pero los ejecutables resultantes producen resultados diferentes: la versión compilada con GCC imprime A y la compilada con Clang imprime B

¿Podrías explicar esta diferencia?

Actualización : como lo señala @VTT, se observa la misma diferencia incluso si se as_const .