Почему адреса функций не являются постоянными выражениями

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

void foo()
{}

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

Это не будет компилироваться.

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

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

Ответ 1

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

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

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

Ответ 2

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

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

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