为什么 libcxx 的 condition_variable 是 constexpr 和 noexcept,但在 The Standard 中却不是?

Why libcxx's condition_variable is constexpr and noexcept, but in The Standard it is not?

https://github.com/llvm-mirror/libcxx/blob/master/include/__mutex_base#L290

class _LIBCPP_TYPE_VIS condition_variable
{
    __libcpp_condvar_t __cv_ = _LIBCPP_CONDVAR_INITIALIZER;
public:
    _LIBCPP_INLINE_VISIBILITY
    _LIBCPP_CONSTEXPR condition_variable() _NOEXCEPT = default;

但标准将其声明为

class condition_variable {
public:
    condition_variable();
    ~condition_variable();

( http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/n4849.pdf )

并且condition_variable()可能会抛出。

是 libcxx 与 C++ 标准不兼容,还是我错了?

如果实现不会抛出异常,则允许将 noexcept 添加到非虚函数,请参阅 C++17 标准(草案 N4659)的 [res.on.exception.handling]/5

但是不允许将 constexpr 添加到函数的实现。参见 [constexpr.functions]/1. See also LWG issue 2013

std::condition_variable::condition_variable() 既未指定为 constexpr,也未指定为 noexcept,但在任何情况下它 必须 抛出异常。参见 [thread.condition.condvar]

所以,noexcept 可以,但 constexpr 不行。但是,标记为 constexpr 的函数不应该标记为常见的不符合项。例如 GCC 故意声明数学函数 constexpr 尽管它们不应该是。