除了使用字符串流的类

时间:2017-01-31 16:16:51

标签: c++11 exception exception-handling noexcept

我的班级有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容器是否可以使用move或者需要进行复制?

1 个答案:

答案 0 :(得分:1)

  1. 使用noexcept operator

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