Есть ли способ использовать адреса функций в постоянных выражениях?Почему адреса функций не являются постоянными выражениями
void foo()
{}
int main()
{
static_assert(&foo, "test error");
}
Это не скомпилирует.
ошибка C2057: ожидается постоянное выражение
Намерение за это, что я хочу, чтобы сравнить два адреса функций во время компиляции.
Я думаю, что это может быть немного сложнее. Одна из проблем с адресами функций заключается в том, что компилятор не обязательно * знает * его значение (он может быть определен в другой единицы перевода или вообще не определен. Каков ожидаемый результат (в момент компиляции *) '& foo 'для этих случаев? (Я не говорю, что это невозможно сделать, это выражение считается * odr-use *, поэтому компилятор может предположить, что он должен быть определен и позволить компоновщику разрешить адрес сбой, если он не определен, но Я бы подошел к стандарту для авторитетного ответа на вопрос. –
Функции известны во время компиляции, но их адреса нет. Символьные имена используются во время компиляции компоновщика на карту памяти позже. Чтобы еще больше усложнить ситуацию, после шаблоны были введены в C++, линкеры почти повсеместно начали складывать функции, имеющие идентичный скомпилированный код. Таким образом, две разные функции могут иметь один и тот же адрес во время выполнения **. Компилятор не должен знать об этом. –
S Ince функции могут быть перемещены во время загрузки (думаю, Windows DLL), то я не вижу, как «& foo» может быть известен, в общем, до тех пор, пока программа не будет запущена. –