In this comment to another question, l'HVD utente indicato quanto segue:Gli array possono essere indicizzati al momento della compilazione?
... sebbene stringhe possono essere passati alle funzioni
constexpr
, e matrice indicizzazione è accettati letterali stringa in costante espressioni, un'operazione di avanzamento intermittente su una Il parametroconstexpr
della funzione non si qualifica come espressione costante.
Non ho capito completamente cosa si intendesse. Vuol dire che la variabile hash_value
nel codice seguente
#include <cstddef>
// Compute the hash of a string literal adding the values of its characters
template<std::size_t N> constexpr std::size_t
hash_string
(const char (& s)[N])
noexcept
{
std::size_t h = 0;
// Array indexing happening under the hood
for (const auto c : s)
h += c;
return h;
}
constexpr auto hash_value = hash_string("Hello, world!");
non può essere valutato al momento della compilazione? Potresti approfondire il commento citato e dire se ho ragione?
Non vedo nulla in C++ 14 standard che vieti questo. Il tuo codice compila bene in clang. –
Molti compilatori fanno questo tipo di ottimizzazione? Sembra molto aggressivo. – tadman
@ T.C. Sì, compila e funziona anche per me su Clang. Tuttavia, e soprattutto dal momento che non conosco il montaggio, voglio assicurarmi che venga valutato al momento della compilazione. – Kalrish