В проекте С++ Draft Standard (N3337) приведено следующее о преобразовании указателей:
4.10 Преобразования указателей
2 rvalue типа "указатель на cv
T
", гдеT
- тип объекта, может быть преобразован в rvalue типа "указатель на cvvoid
". Результат преобразования "указатель на cvT
" в "указатель на cvvoid
" указывает на начало места хранения, где находится объект типаT
, как если бы объект был наиболее производным объектом (1.8) типаT
(т.е. Не подобъект базового класса).
и
4.12 Логические преобразования
1 Значение арифметики, перечисления, указателя или указателя на тип члена может быть преобразовано в rvalue типа
bool
. Значение нуля, значение нулевого указателя или значение указателя нулевого элемента преобразуется в значение false; любое другое значение преобразуется в true
Исходя из вышесказанного, вполне нормально преобразовать указатель на функцию или указатель на int
в void*
, а также bool
.
Однако, учитывая выбор того и другого, который должен преобразовать указатель в?
И затем, почему указатель на функцию преобразуется в bool
и указатель на int
преобразуется в void*
?
Программа:
#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;
}
Вывод, используя g++ 4.7.3:
In foo(bool) In foo(void*)