Che cos'è un valore noto al momento della compilazione?
Penso che abbia più senso parlare di espressioni costanti. Un'espressione costante ha un valore che è noto al momento della compilazione. In parole povere, può essere semplicemente un letterale, il nome di un'altra variabile (il cui valore è di nuovo noto al momento della compilazione) o un'espressione complessa che coinvolge sottoespressioni con valori noti al momento della compilazione.
La citazione afferma che l'inizializzatore di una variabile dichiarata con constexpr
deve essere un'espressione costante. In particolare ci sono dei requisiti che un'espressione deve soddisfare per essere un'espressione costante; Questi sono elencati here.
Esempi sono
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
volte un valore non è effettivamente noto al momento della compilazione, ma l'espressione non è una costante uno secondo standard. Che include
int i = 43;
constexpr int j = reinterpret_cast<int>(i); // Shouldn't compile. (Does with GCC)
Ci sono casi erano il compilatore può fare costante pieghevole - alcuni valori possono essere calcolati in fase di compilazione, ma non devono essere.
int i = 0;
for (int j = 1; j != 10; ++j)
i += j;
return i;
Il compilatore può eliminare completamente i loop e inizializzare i
con 55
(o semplicemente restituire 55
ed eliminare i
troppo) finché il comportamento rimane lo stesso. Questo è noto come the as-if rule.
ad esempio: 'int x = 3.0f;', il valore di 'x' è noto al momento della compilazione. – Borgleader
La definizione è fuorviante: un constexpr (in C++ 11) è un valore o una funzione che può essere valutata in fase di compilazione. –
Relativo a ["Espressioni costanti" precedenti a C++ 11] (http://stackoverflow.com/q/26024942/170880) ... nella mia risposta c'è un sacco di lavoro a terra che può essere utile. Ciò che definisce un'espressione costante è difficile da definire in un modo semplice. –