почему адрес функции c ++ всегда True? - PullRequest
6 голосов
/ 17 мая 2011

ну почему бы,

#include <iostream>

using namespace std;

int afunction () {return 0;};

int anotherfunction () {return 0;};

int main ()
{
    cout << &afunction << endl;
}

дай это,

1

  1. почему адрес каждой функции истинен?
  2. и как тогда может работать указатель на функцию, если все функции имеют (кажется) одинаковые адреса?

Ответы [ 7 ]

15 голосов
/ 17 мая 2011

Адрес функции не "истина". Нет перегрузки для ostream, который принимает произвольный указатель на функцию. Но есть один для логического значения, и указатели на функции неявно преобразуются в bool. Таким образом, компилятор преобразует afunction из любого его значения в true или false. Поскольку у вас не может быть функции по адресу 0, напечатанное значение всегда равно true, которое cout отображается как 1.

Это показывает, почему неявные преобразования обычно не одобряются. Если бы преобразование в bool было явным, вы бы имели ошибку компиляции вместо того, чтобы молча делать неправильные вещи.

3 голосов
/ 17 мая 2011

Тип указателя на функцию не поддерживается std::ostream из коробки. Ваши указатели конвертируются в единственно возможный совместимый тип - bool - и все, что не равно нулю, равно true благодаря обратной совместимости с C.

2 голосов
/ 17 мая 2011

Нет перегрузки operator<< для указателей функций (кроме потоковых манипуляторов), но есть одна для bool, поэтому указатель функции преобразуется в этот тип перед отображением.

Адреса не равны, но оба они не равны нулю, и, следовательно, они оба преобразуются в true.

1 голос
/ 17 мая 2011

перегруженной функции нет: operator<<(ostream&, int(*)()), поэтому указатель вашей функции преобразуется в единственный работающий тип, bool.Затем operator<<(ostream&, bool) печатает преобразованное значение: 1.

Вы можете распечатать адрес функции следующим образом:

cout << (void*)&afunction << endl;
0 голосов
/ 17 мая 2011

Не может быть перегрузки для указателей функций для оператора iostream <<, поскольку существует бесконечное число возможных типов указателей на функции.Таким образом, указатель на функцию получает преобразование, в данном случае в bool.Попробуйте: </p>

cout << (void *) afunction << endl;

Что даст вам адрес в шестнадцатеричном формате - для меня результат был:

0x401344
0 голосов
/ 17 мая 2011

Вы также проверяли anotherfunction()?

В любом случае, адреса указателей C ++, такие как адреса указателей C, обычно являются виртуальными на большинстве платформ и не соответствуют непосредственно ячейкам памяти. Следовательно, значение может быть очень маленьким или необычным.

Кроме того, они всегда будут истинными, так как 0 равен NULL, недопустимый указатель, а все, что больше 0, является истинным

0 голосов
/ 17 мая 2011

Все адреса в C ++ отличны от нуля, потому что ноль - это нулевой указатель и зарезервированное значение.Любое ненулевое значение считается истинным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...