Sto imparando come usare condizionale noexcept
e imbattersi in questo problema. Supponiamo che io sono una classe:noexcept espressione vs tipo tratti
template<typename T>
class Wrapper {
public:
Wrapper(T&& value) noexcept(/* ??? */)
: value_(std::move(value))
{}
private:
T value_;
};
Per la parte /* ??? */
, ho pensato che possiamo usare sia noexcept(T(std::move(value)))
o std::is_nothrow_move_constructible<T>::value
, fino a quando sono incappato in this.
Quindi, se io uso noexcept(noexcept(T(std::move(value))))
, a rigor di termini che sto dicendo che "questo costruttore è noexcept
se e solo se la costruzione e distruggendo un T
è noexcept
"?
Anche se i distruttori che lanciano devono essere messi a fuoco e bruciati.
È possibile aggirare il problema utilizzando ad es. 'noexcept (new T (std :: move (value)))' o qualcosa del genere? Dal momento che si tratta di un'espressione non valutata, in realtà non sta allocando nulla, ma dovrebbe anche "filtrare" in modo specifico e quindi il dtor non dovrebbe essere coinvolto ... Suppongo che potrebbe essere necessario usare una versione no-throw del nuovo però, dato che non lo fai t voglio rilevare 'std :: bad_alloc'. –