У меня есть класс с членом std::stringstream
:
class Buffer
{
std::stringstream ss_;
};
Его конструктор перемещения
Buffer::Buffer(Buffer&& buf)
: ss_(std::move(buf.ss_))
{
}
Я подозреваю, что операция перемещения не вызовет исключение, и из-за этого конструктор перемещения может быть noexcept
. Итак, мои вопросы:
- Как определить, объявлена ли функция из STL
noexcept
, напримерstd::stringstream::str
? - Если замена или перемещение
stringstream
не былоnoexcept
, могу ли я объявитьBuffer
членовnoexcept
и получить вызовstd::unexpected()
, еслиstringstream
выдает исключение? Из того, что я могу найти, это было бы так. - Есть ли способ обойти проблему, например, альтернативный контейнер, в который можно записать с помощью операторов потока, и это
noexcept
? - Если я последую этим предложениям и просто не буду использовать
noexcept
, могу ли я ожидать, что компилятор определит, могут ли контейнеры STL использовать перемещение или вместо этого нужно сделать копию?