Здравствуйте, _NN_, Вы писали:
_NN>На днях столкнулся с особенностью std::exchange.
_NN>Как оказывается функция не является noexcept, а почему использовать её в конструкторе перемещения нельзя.
а почему нельзя? Если вы уверены, что функция не бросит исключение, вы её вполне можете использовать в деструкторах, перемещающих конструкторах и пр. не обращая внимание есть ли там noexcept, или нет.
_NN>Очевидно напрашивается написать свой аналог exchange_no_except.
std::swap? Вообще, вопрос звучит так, как будто вам нужен именно swap.
_NN>Почему об этом не подумали в стандарте и как пишете вы ?
наверное потому что std::exchange может внутри делать копирование. И тогда noexcept точно не поставишь. Можно было бы извращаться, написать кучу перегрузок и в каких-то случаях поставить вожделенный noexcept, но подозреваю что не очень то и надо.
std::string some_value, new_value;
auto old_value = std::exchange(some_value, new_value); // вот тут может быть брошено исключение