7 votes

expression noexcept et traits de type

J'apprends à utiliser le conditionnel noexcept et je suis tombé sur ce problème. Supposons que j'ai une classe :

template<typename T>
class Wrapper {
public:
    Wrapper(T&& value) noexcept(/* ??? */)
        : value_(std::move(value))
    {}

private:
    T value_;
};

Pour le /* ??? */ je pensais que nous pouvions utiliser soit noexcept(T(std::move(value))) o std::is_nothrow_move_constructible<T>::value jusqu'à ce que je tombe sur este .

Donc si j'utilise noexcept(noexcept(T(std::move(value)))) à proprement parler, je dis que "ce constructeur est noexcept si l'on construit et en détruisant a T es noexcept " ?

Bien que les destructeurs qui lancent devraient être mis sur le feu et brûlés.

6voto

Walter Points 7554

Bonne question, voir aussi cette discussion sur le défaut de langage . D'après son nom, il est clair que std::is_nothrow_move_constructible<T>::value devrait ne concernent que la construction à partir d'une rvalue (mais dans la pratique, ils peuvent aussi concerner la destruction), tandis que noexcept(T(std::move(value))) est toujours liée à la fois à la construction et à la destruction.

Donc, dans votre cas, le moyen le plus sûr, en évitant la question non résolue de la std::is_nothrow_move_constructible est d'utiliser de nouveaux placements, évitant ainsi le problème avec les std::bad_alloc (mentionné dans le commentaire de Chris Beck), et, de la même manière, utiliser T pour le destructeur de l'enveloppe.

template<typename T>
class Wrapper {
public:
    Wrapper(T&& value) noexcept(new(nullptr) T(std::move(value)))
        : value_(std::move(value))
    {}
    ~Wrapper() noexcept(noexcept(value_.T::~T()))
    {}
private:
    T value_;
};

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X