Il costruttore di default di std::chrono::duration
è definito come segue:Come può essere std :: chrono :: duration :: duration() constexpr?
constexpr duration() = default;
(. Ad esempio, vedere cppreference.com o della sorgente libstdC++)
Tuttavia, cppreference.com also says this circa constexpr
costruttori:
Un costruttore di constexpr deve soddisfare i seguenti requisiti:
...
ogni classe base e ogni membro non statico deve essere inizializzato, sia nell'elenco costruttori inizializzazione o da un elemento di rinforzo o uguale inizializzatore. Inoltre, ogni costruttore coinvolto deve essere un costruttore constexpr ed ogni clausola di ogni inizializzatore brace o uguale deve essere un'espressione costante
E nel caso in cui ero confuso circa costruttori predefiniti, cppreference.com seems to say che costruttori di default hanno portato in essere con = default
non sono definiti in modo diverso rispetto ai costruttori impliciti di default.
Tuttavia, il tipo rep
per (la maggior parte) durate è un tipo intero nudo. Quindi, qualora l'esplicito costruttore di default per = default
duration
essere equivalente a
constexpr duration() {}
che ovviamente avrebbe lasciato la variabile membro intero di tipo duration::rep
inizializzata? E, in effetti, non è il comportamento standard di duration
tale che i valori predefiniti sono non inizializzati? (Ma non riesco a trovare un punto di riferimento che dice in modo esplicito questo.)
Così come può il costruttore = default
per duration
essere constexpr
se lascia una variabile membro non statico inizializzata? Cosa mi manca?
Credo che questo significhi che gli implementatori ci hanno in fase di inizializzazione della classe. – NathanOliver
È 'constexpr' su un temploid, quindi anche se la versione di default non soddisfa il requisito di un costruttore di constexpr è ancora OK - non può essere usato solo in espressioni costanti. –
'duration :: rep' è un tipo, non un membro, non è vero? – AndyG