Utilizzo constexpr

di il
3 risposte

Utilizzo constexpr

Ciao a tutti!
Ho cercato nel forum ma non ho trovato risposta, mi scuso nel caso questo sia 3d duplicato:
devo applicare una costexpr per creare una lookup table,
e ho abozzato questo codice:

static float lookup[10];

constexpr static double* initLookUp();

static double getDimension(int n);

constexpr static double* initLookUp(){
for (int i = 0; i < 10; i=i+1){
lookup = 2*i*ceil(log2(i+1));
}
}

static double getDimension(int n){
return lookup[n];
}

int main(){
double d = getDimension(3);
std::cout<<"\n lookup = "<< d <<"\n";
}


Quando però compilo mi esce l'errore:
error: statement not allowed in constexpr function
for (int i = 0; i < 10; i=i+1){
...

Ho provato a capire il problema, il mio errore, ma non sono riuscita a capire
Avete suggerimenti?
Grazie!

3 Risposte

  • Re: Utilizzo constexpr

    Con Mingw 7.2.0 non ho errori (a parte un warning dovuto al fatto che initLookUp dovrebbe restituire qualcosa ma non lo fa).
    Dovresti controllare le opzioni di compilazione: il C++11 è molto più restrittivo rispetto al C++14 riguardo constexpr.
    E' probabile che stai compilando con il flag C++11 (o equivalente).
  • Re: Utilizzo constexpr

    Grazie mille per l'aiuto!
    Il file CMakelists che ho scritto dice però
    cmake_minimum_required(VERSION 3.10)
    set(CMAKE_CXX_STANDARD 14)

    include(CheckCXXCompilerFlag)
    CHECK_CXX_COMPILER_FLAG("-std=c++14" COMPILER_SUPPORTS_CXX14)
    if (COMPILER_SUPPORTS_CXX14)

    Non è il 14?
    Grazie!
  • Re: Utilizzo constexpr

    Si, ma quel if (COMPILER_SUPPORTS_CXX14) immagino presupponga che il compilatore supporti effettivamente il C++14.
    A ogni modo qui c'è il tuo codice (appena differente)
    https://godbolt.org/z/BJd6V
    e come puoi vedere la tua initLookUp() è calcolata a runtime. Il motivo è che ne ceil ne log2 sono funzioni a loro volta constexpr.
Devi accedere o registrarti per scrivere nel forum
3 risposte