我将学习如何使用条件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))))
,严格来说,我是在说“当构造和销毁一个T
是noexcept
时,此构造函数才是noexcept
”?尽管抛出异常的析构函数应该被点燃并烧掉。
noexcept(new T(std::move(value)))
或类似的方式解决这个问题?由于它是一个未求值表达式,实际上并没有分配任何东西,但也应该特别地“泄漏”,所以析构函数不应该参与其中...... 我猜你可能需要使用 no-throw 版本的 new,因为你不想检测到std::bad_alloc
。 - Chris Beck