Función de miembro de const y typedef, C++
language-lawyer member-functions (2)
Supongamos que queremos declarar la función miembro constante a través de typedef
:
typedef int FC() const;
typedef int F();
struct A
{
FC fc; // fine, we have ''int fc() const''
const F fc; // not fine, ''const'' is ignored, so we have ''int fc()''
};
Como se ignora const
el programa compila bien. ¿Por qué se ignora const
para la función? Ya que podemos formar un puntero constante de esta manera, lo único que puedo pensar es en la "herencia C". ¿La norma dice algo al respecto?
Estándar C ++ 14, [dcl.fct] pt. 7:
El efecto de un cv-qualifier-seq en un declarador de funciones no es lo mismo que agregar un cv-qualification sobre el tipo de función. En este último caso, los calificadores cv son ignorados. [Nota: un tipo de función que tiene un cv-qualifier-seq no es un tipo calificado por cv; No hay tipos de funciones calificadas por CV. - nota final]
Ejemplo:
typedef void F();
struct S {
const F f; // OK: equivalent to: void f();
};
Por lo tanto, este es un comportamiento correcto.
Este cambio lo realiza el CWG 295 , esencialmente para facilitar la programación genérica. Considerar:
template<class F>
void meow(const F& f) { f(); }
void purr();
meow(purr);
Ignorar las const
adicionales permite que esto funcione.