为什么 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
尽管它们不应该是。
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
尽管它们不应该是。