为什么 std::mutex::unlock() 不是 noexcept

Why is std::mutex::unlock() not noexcept

为什么 std::mutex::unlock() 不是 noexept?出于某种原因,当不拥有互斥量的线程对其调用 unlock() 时,标准未定义行为。这样做的理由是什么?如果函数抛出,这不会导致 std::unique_lockstd::lock_guard 析构函数实现意外泄漏其析构函数中的异常吗?

注意 抛出 - https://akrzemi1.wordpress.com/2011/09/21/destructors-that-throw/

的析构函数

std::unique_lock 有一个标志来指示它是否 'owns' 锁。成功调用 lock 后,它会设置标志。当您调用 unlock 时,标志将被重置。

调用析构函数时,如果不拥有锁,则不会调用unlock

我不能说为什么委员会没有做到 noexcept。我只能指出这样一个事实,即 noexcept 通常只明确应用于整个标准库中的几个关键函数,这些函数是实现提供强大异常保证的高效函数所必需的(如 std::swap 或移动构造函数)。

但就 std::unique_lock 而言:它的析构函数是(隐含地)noexcept,因此如果实现允许 unlock 抛出,unique_lock 的析构函数必须在内部捕获它。