Из того, что я понял из этого ответа, результат функции constexpr
не является константным выражением, если функция еще не объявлена . Что меня удивляет, так это следующий фрагмент кода:
constexpr int f();
constexpr int g() {
return f();
}
constexpr int f() {
return 42;
}
int main() {
constexpr int i = g();
return i;
}
Это компилируется без проблем и работает. Перемещение определения f
за пределы основных триггеров error: 'constexpr int f()' used before its definition
, как и следовало ожидать.
Я предполагаю, что это работает, потому что f
был определен до вызова g
, поэтому оба вызова являются константными выражениями.
Почему f()
и g()
явно являются выражениями-константами, хотя f
не определено, когда оно вызывается g
? Как это описано в Стандарте?
Я проверил это на GCC 6.1.0 и Clang 3.8.0 от Coliru.
constexpr
? - person Kerrek SB   schedule 30.05.2016constexpr
должна иметь определение только тогда, когда она становитсяodr-used
. Таким образом, хотяf()
не имеет определения вg()
, компилятор может угадать телоg()
с помощью простого объявления, но для фактического вызоваg()
вам нужно определениеf()
, потому что вызов функции считаетсяodr-use
. Так что да, данный ответ действителен, но я думаю, что именно это смутило ОП. - person KABoissonneault   schedule 30.05.2016