C++ 17 Aggiornamento: static constexpr
variabili sono implicitamente inline
quindi non è necessaria alcuna definizione esterna.Perché dovrei preferire il comando statico constexpr int in una classe su enum per le costanti integrali di livello di classe?
domanda originale:
Diciamo che ho una lista di costanti quali
struct Cls {
static constexpr int N = 32;
static constexpr int M = 64;
};
Questo naturalmente suggerisce che aggiungo definizioni per questi per evitare problemi di ODR-utilizzo che possono verificarsi quindi ho bisogno:
constexpr int Cls::N;
constexpr int Cls::M;
Perché dovrebbe Io preferisco questo oltre
struct Cls {
enum : int {
N = 32,
M = 64
};
};
Il che mi fa risparmiare dei mal di testa ODR-utilizzo dal N
e M
sono più veramente solo costanti e non oggetti a se stanti (un affare più grande se questo è un colpo di testa-solo) ed è più breve. Potrei specificare esplicitamente il tipo enum : long long
o qualsiasi altra cosa se necessario. Qual è il vantaggio del primo?
Come scritto, 'N' e' M' sono di tipo anonimo 'enum', non di tipo' int'. Come dici tu, puoi specificare 'enum: int'; Ti suggerisco di farlo nel tuo esempio. –
@KeithThompson done –
@zenith la domanda in questo è "_non c'è modo di dire al compilatore che constexpr int SOME_VALUE = 27 significa che SOME_VALUE dovrebbe essere trattato solo come costante di tempo di compilazione e mai oggetto con linkage_ esterno" e questo è ciò che le risposte affrontano. Sto chiedendo se ci sia qualche vantaggio nell'usare 'static constexpr' invece di' enum's che mi motiverà a usarli per le costanti di livello di classe. –