¿Por qué puntero a int se convierte a void * pero puntero a función se convierte a bool?

El C ++ Draft Standard (N3337) tiene lo siguiente sobre la conversión de punteros:

4.10 Conversiones de puntero

2 Un valor de tipo "puntero aCV T," dóndeT es un tipo de objeto, se puede convertir a un valor de tipo "puntero aCV void. "El resultado de convertir un" puntero aCV T"A un" puntero aCV void"Apunta al inicio de la ubicación de almacenamiento donde el objeto de tipoT reside, como si el objeto es un objeto más derivado (1.8) de tipoT (es decir, no es un subobjeto de clase base).

y

4.12 Conversiones booleanas

1 Un valor de aritmética, enumeración, puntero o puntero al tipo de miembro se puede convertir a un valor de tipobool. Un valor cero, un valor de puntero nulo o un valor de puntero de miembro nulo se convierte en falso; cualquier otro valor se convierte en verdadero

Basado en lo anterior, está perfectamente bien convertir un puntero de función o un puntero en unint a unvoid* tanto comobool.

Sin embargo, dada la elección de ambos, ¿a cuál debería convertirse un puntero?

Y luego, ¿por qué un puntero a una función se convierte en unbool y un puntero a unint convertir a unvoid*?

Programa:

#include <iostream>
using namespace std;

void foo(const void* ptr)
{
   std::cout << "In foo(void*)" << std::endl;
}

void foo(bool b)
{
   std::cout << "In foo(bool)" << std::endl;
}

void bar()
{
}

int main()
{
   int i = 0;
   foo(&bar);
   foo(&i);
   return 0;
}

Salida, usando g ++ 4.7.3:

In foo(bool)
In foo(void*)

Respuestas a la pregunta(0)

Su respuesta a la pregunta