Почему адреса функций не являются константными выражениями - PullRequest
12 голосов
/ 04 марта 2012

Есть ли способ использовать адреса функций в константных выражениях?

void foo()
{}

int main()
{
  static_assert(&foo, "test error");
}

Это не скомпилируется.

ошибка C2057: ожидаемое постоянное выражение

Цель этого заключается в том, чтобы я хотел сравнить два адреса функции во время компиляции.

Ответы [ 2 ]

6 голосов
/ 04 марта 2012

Это определенно ошибка компилятора.

Функции могут использоваться в качестве аргумента шаблона для шаблона, что означает, что они являются константными выражениями. (См. ideone ).

Кроме того, приведенный выше код прекрасно компилируется с gcc 4.6.1, хотя ideone не компилирует его, но ideone использует gcc-4.5.1, что имеет ошибку в отношении вашего кода.

3 голосов
/ 04 марта 2012

Это мое понимание, FWIW:

Функция type известна во время компиляции, но функция address известна только во время соединения. Таким образом, вы можете использовать типы функций в качестве параметров шаблона, но адреса не являются постоянными / известными во время компиляции.

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

...