Noexcept for 类 使用字符串流

Noexcept for classes that use a stringstream

我有一个 class 有一个 std::stringstream 成员:

class Buffer
{
    std::stringstream ss_;
};

它的移动构造函数是

Buffer::Buffer(Buffer&& buf)
: ss_(std::move(buf.ss_))
{
}

我怀疑移动操作不会抛出,因此移动构造函数可能是 noexcept。所以我的问题是:

  1. 如何确定是否声明了来自 STL 的函数 noexcept,例如 std::stringstream::str
  2. 如果交换或移动 stringstream 不是 noexcept,我是否仍可以声明 Buffer 成员 noexcept 并调用 std::unexpected() 如果stringstream 引发异常?据我所知,情况确实如此。
  3. 是否有解决该问题的方法,例如可以使用流运算符写入的备用容器 noexcept
  4. 如果我遵循 these 建议而不使用 noexcept,我是否可以期望编译器确定 STL 容器是否可以使用移动或需要进行复制?
  1. 使用noexcept operator:

    noexcept(std::declval<std::stringstream>().str())
    
  2. 是。

  3. 内存和I/O不是无限的资源。很容易想到两种策略来处理资源不可用:抛出异常或终止应用程序。
  4. 是的,defaulted special member functions have implicit nothrow(true) exception specification when the conditions are met,即基类和成员对应的特殊成员函数也必须是nothrow(true).