g ++ “llamar” una función sin paréntesis (no f () sino f;). ¿Por qué siempre devuelve 1?

En c ++ (GNU GCC g ++), mi código está “llamando” a una función sin (). La función no funciona, pero comstack bien.

Más sorprendentemente, el código siempre devuelve 1 …

¿Hay alguna explicación?

Esperaba que el nombre de la función fuera solo un puntero regular, pero parece que es un poco diferente …

¿Obtuve todos los 1 solo por casualidad?

#include  using namespace std; void pr () { cout << "sth"; } int main() { pr; cout << pr; // output: 1 cout << *pr; // output: 1 cout << &pr; // output: 1 } 

En realidad, no está llamando a pr en su código, está pasando el puntero de función a cout . pr se está convirtiendo luego en bool cuando se pasa a cout . Si pones cout << boolalpha antemano obtendrás true lugar de 1 .

EDITAR:
Con C ++ 11 puede escribir la siguiente sobrecarga:

  template  std::ostream & operator<<(std::ostream & s, RType(*func)(ArgTypes...)) { return s << "(func_ptr=" << (void*)func << ")(num_args=" << sizeof...(ArgTypes) << ")"; } 

lo que significa que la llamada cout << pr se imprimirá (func_ptr=

)(num_args=0)

. La función en sí misma puede hacer lo que quiera obviamente, esto es solo para demostrar que con las plantillas variadas de C ++ 11, puede hacer coincidir los punteros de función de aridad arbitraria. Esto aún no funcionará para las funciones sobrecargadas y plantillas de funciones sin especificar qué sobrecarga desea (generalmente a través de un molde).

El nombre de una función, cuando se usa sin paréntesis, se puede convertir implícitamente en un puntero de función. De hecho, cuando lo desreferencia o referencia, sigue siendo nada más que un puntero de función, o un puntero a un puntero de función, etc. Estos punteros de función, cuando se imprimen, se convierten implícitamente en bool , por lo que simplemente producen 1. Si desea dar salida a la dirección de memoria real de la función, convertirla en un puntero de vacío:

 cout<<(void*)pr;