微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c – noexcept表达式与类型特征

我正在学习如何使用条件noexcept并遇到这个问题.假设我有一个班级:
template<typename T>
class Wrapper {
public:
    Wrapper(T&& value) noexcept(/* ??? */)
        : value_(std::move(value))
    {}

private:
    T value_;
};

为了 /* ??? * /部分,我认为我们可以使用noexcept(T(标准::移动(值)))或std :: is_nothrow_move_constructible< T> ::值,直到我在this绊倒.

所以如果我使用noexcept(noexcept(T(std :: move(value)))),严格来说我说“如果构造和破坏T是noexcept,那么这个构造函数是noexcept”?

虽然扔掉的破坏者应该着火并烧毁.

解决方法

好问题,另见 this language defect discussion.从名称可以清楚地看出,std :: is_nothrow_move_constructible< T> :: value应仅与rvalue的构造性相关(但实际上也可能与破坏有关),而noexcept(T( std :: move(value)))总是与构造和破坏有关.

所以,在你的情况下,避免std :: is_nothrow_move_constructible traits的未解决问题的最省钱方法是使用placement new,避免std :: bad_alloc的问题(在Chris Beck的评论中提到),同样地,使用T是包装器析构函数的析构函数.

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_;
};

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐