2015-12-03 12 views
6

consideri il codiceDefinizione diverso da dichiarazione di constexpr membro statico

#include <iostream> 

struct Foo 
{ 
    constexpr static int n = 42; 
}; 

const int Foo::n; // note const, NOT constexpr 

int main() 
{ 
    std::cout << Foo::n; 
} 

La definizione del membro statico è diversa dalla dichiarazione di classe, cioè const viene usato al posto di constexpr. Il codice è legale e se sì, perché? Compilano sia con gcc che con clang. Compilare anche se abbiamo intercambiato const e constexpr nella definizione e dichiarazione, rispettivamente. So che constexpr implica const sulle variabili, ma non il contrario.

risposta

1

I miei due centesimi, mentre guardo alcuni documenti come that one.

In realtà, potrebbe essere valido.

In effetti, la differenza tra constexpr e const si basa principalmente sui loro scopi, ma il primo implica un secondo effetto collaterale.

C'è anche una differenza più sottile: constexpr è un specificatore, mentre const è un qualificatore di tipo.

In particolare: funzione primaria

di const è di esprimere l'idea che un oggetto non viene modificato tramite un'interfaccia

Sull'altro lato: funzione primaria

di constexpr è estendere il range di ciò che può essere calcolato in fase di compilazione, rendendo tale tipo di calcolo sicuro e utilizzabile anche in contesti di compilazione

O anche più concisa da here:

constexpr - specifica che il valore di una variabile o una funzione può apparire in espressioni costanti

Comunque accade che:

constexpr di fronte a una definizione di variabile [...] implica const

Quindi, anche se la ragione per cui si dovrebbe usare constexpr anziché const è chiara, e ognuno tende a ricordare che:

constexpr non sostituisce generale scopo per const (o viceversa)

E 'un dato di fatto che l'utilizzo di constexpr in realtà si sta dicendo che questo membro è implicitamente const (anche di avere un insieme di vincoli più specifici su come quel membro può essere definito).

In ogni caso, una volta definito, il membro non è altro che un membro di dati con il qualificatore di tipo const (che può essere utilizzato in espressioni costanti), ovvero ciò che si dichiara fuori dalla classe.

Problemi correlati