Почему в libcxx условие-переменная является constexpr и noexcept, а в стандарте - нет? - PullRequest
1 голос
/ 23 марта 2020

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 ++ или я ошибаюсь?

1 Ответ

3 голосов
/ 23 марта 2020

Реализация может добавить noexcept к не виртуальной функции, если она никогда не выдаст исключение, см. [res.on.exception.handling] / 5 C ++ 17 стандарт (черновик N4659).

Однако реализации не разрешено добавлять constexpr в функцию. См. [constexpr.functions] / 1 . См. Также выпуск LWG 2013 .

std::condition_variable::condition_variable() не указан ни constexpr, ни noexcept, но нет обстоятельств, при которых необходимо выбросить исключение. См. [thread.condition.condvar] .

Итак, noexcept в порядке, а constexpr - нет. Однако функции, помеченные constexpr, которых не должно быть, являются распространенным несоответствием. Например, G CC объявляет математические функции сознательно constexpr, хотя они не должны быть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...