Просто потому, что функция (или конструктор)...
- объявлен constexpr и
- определение функции соответствует требованиям constexpr
... не означает, что компилятор будет оценивать функцию constexpr во время перевода. Я просматривал С++ 11 FDIS (N3242, доступный в http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/), чтобы попытаться определить две вещи:
- Когда компилятор обязан оценивать функцию constexpr во время перевода?
- Когда компилятору разрешено оценивать функцию constexpr во время перевода?
Раздел 5.19 В пункте 1 говорится, что константные выражения могут быть оценены во время перевода. Насколько я могу понять, в оставшейся части раздела 5.19 излагаются правила того, что справедливо в определении функции constexpr.
Я понимаю, что могу заставить constexpr оценивать во время перевода, объявляя результат функции constexpr как constexpr. Вот так:
// Declaration
constexpr double eulers_num() { return 2.718281828459045235360287471; }
// Forced evaluation during translation
constexpr double twoEulers = eulers_num() * 2.0;
static_assert(twoEulers > 5.0, "Yipes!");
До сих пор мне не удалось найти абзацы в FDIS, что:
- Force
twoEulers
для оценки во время перевода или - Укажите другие ситуации, когда компилятор может или должен оценивать функцию constexpr во время перевода.
То, что меня особенно интересует, заключается в том, запускается ли constexpr при переводе:
- Когда все параметры, переданные функции constexpr, являются литералами или
- Подразумеваемый аргумент объекта при разрешении перегрузки (раздел 13.3.1, параграф 3) является либо constexpr, либо требует литерала (например, для размеров массива) или
- Что-то еще полностью.
По возможности, в ваших ответах укажите разделы FDIS, которые я могу найти или ключевые фразы, которые я могу найти в FDIS. Английский в стандарте несколько тупой, поэтому я, возможно, читал соответствующие параграфы и полностью упустил их смысл или намерение.