noexcept表达与类型特征

noexcept expression vs type traits

本文关键字:类型 特征 noexcept      更新时间:2023-10-16

我正在学习如何使用条件noexcept并遇到此问题。假设我有一个课:

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

对于/* ??? */零件,我认为我们可以使用noexcept(T(std::move(value)))std::is_nothrow_move_constructible<T>::value,直到我偶然发现它。

因此,如果我使用noexcept(noexcept(T(std::move(value)))),严格来说,我是说"该构造函数是 noexcept iff构造和破坏 a Tnoexcept

虽然投掷的破坏者应放火并燃烧。

好问题,另请参阅此语言缺陷讨论。从其名称中,很明显std::is_nothrow_move_constructible<T>::value 应该仅与rvalue的构造相关(但实际上也可能与破坏有关),而noexcept(T(std::move(value)))始终与构造和破坏有关。

因此,在您的情况下,避免std::is_nothrow_move_constructible特征的未解决问题的最保存方式是使用新的位置,避免使用std::bad_alloc(在Chris Beck的评论中提到),并且类似地使用T'S包装剂的后裔。

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