Что такое значение, известное во время компиляции?
Я думаю, что имеет смысл говорить о постоянных выражениях. Постоянное выражение имеет значение, которое известно во время компиляции. Грубо говоря, это может быть просто буквальный, имя другой переменной (значение которой снова известно во время компиляции) или сложное выражение, содержащее подвыражения со значениями, известными во время компиляции.
В цитате указано, что инициализатор переменной, объявленной с constexpr
, должен быть постоянным выражением. В частности, существуют требования, которые выражение должно удовлетворять постоянному выражению; Они перечислены here.
Примерами являются
constexpr int i = 54;
constexpr float f = 684; // Compile-time conversion from int to float
constexpr int func(int i)
{
return i*47 % 23;
}
constexpr auto value = func(i * f); // Okay; constexpr function called
// with arguments that, when substituted inside,
// yield constant expressions
Иногда значение фактически известно во время компиляции, но это выражение не является константой один в соответствии со стандартом. Это включает в себя
int i = 43;
constexpr int j = reinterpret_cast<int>(i); // Shouldn't compile. (Does with GCC)
Есть случаи были компилятор может сделать постоянное складывание - некоторые значения могут быть вычислены во время компиляции, но не должен быть.
int i = 0;
for (int j = 1; j != 10; ++j)
i += j;
return i;
компилятор может полностью устранить петлю и инициализировать i
с 55
(или просто вернуть 55
и устранить i
тоже), пока поведение остается неизменным. Это называется the as-if rule.
например: 'int x = 3.0f;', значение 'x' известно во время компиляции. – Borgleader
Определение вводит в заблуждение - constexpr (в C++ 11) является значением или функцией, которая может быть оценена во время компиляции. –
Связано с [«Константные выражения» до C++ 11] (http://stackoverflow.com/q/26024942/170880) ... в моем ответе есть много оснований для работы, которые могут быть полезны. То, что определяет постоянное выражение, трудно определить простым способом. –