Почему адреса функций не являются постоянными выражениями
Есть ли способ использовать адреса функций в постоянных выражениях?
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:
Тип функции известен время компиляции, но адрес функции известен только во время соединения. Таким образом, вы можете использовать типы функций в качестве параметров шаблона, но адреса во время компиляции не являются постоянными/известными.
В вашем примере кода компилятор может определить, что адрес во время компиляции не равен нулю, но тогда он не сможет узнать конкретный адрес. Однако это не ошибка компилятора.