Grazie a @Yakk e @ T.C. per le loro spiegazioni. Mi sento un esempio dovrebbe rendere le cose più chiare:
struct wrapper {
int value;
// non-explicit constexpr constructor
constexpr wrapper(int v) noexcept : value(v) {}
// non-constexpr copy & move constructors
wrapper(const wrapper& that) noexcept : value(that.value) {}
wrapper(wrapper&& that) noexcept : value(that.value) {}
};
constexpr wrapper make_wrapper(int v)
{
return {v};
}
int main()
{
constexpr auto x = make_wrapper(123); // error! copy/move construction,
// but no constexpr copy/move ctor
constexpr int y = make_wrapper(123).value; // ok
static_assert(y == 123, ""); // passed
}
Così make_wrapper
fa ritorno con successo un constexpr wrapper
; è la costruzione di copia/spostamento (sebbene solitamente elisa dai compilatori) che impedisce la compilazione del codice, poiché non esiste un costruttore di copia/spostamento constexpr
.
Possiamo verificare constexpr
-ness dell'oggetto restituito (temporaneo) wrapper
utilizzando il suo valore membro per inizializzare una variabile constexpr
.
fonte
2016-06-21 09:57:16
Non ci sono domande in questa domanda. – immibis
@immibis Aggiornato :) –
cppreference non ha evocato che 'constexpr' dal nulla, sai ... –