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
。所以我的问题是:
- 如何确定是否声明了来自 STL 的函数
noexcept
,例如 std::stringstream::str
?
- 如果交换或移动
stringstream
不是 noexcept
,我是否仍可以声明 Buffer
成员 noexcept
并调用 std::unexpected()
如果stringstream
引发异常?据我所知,情况确实如此。
- 是否有解决该问题的方法,例如可以使用流运算符写入的备用容器
noexcept
?
- 如果我遵循 these 建议而不使用
noexcept
,我是否可以期望编译器确定 STL 容器是否可以使用移动或需要进行复制?
-
noexcept(std::declval<std::stringstream>().str())
是。
- 内存和I/O不是无限的资源。很容易想到两种策略来处理资源不可用:抛出异常或终止应用程序。
- 是的,defaulted special member functions have implicit
nothrow(true)
exception specification when the conditions are met,即基类和成员对应的特殊成员函数也必须是nothrow(true)
.
我有一个 class 有一个 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
? - 如果我遵循 these 建议而不使用
noexcept
,我是否可以期望编译器确定 STL 容器是否可以使用移动或需要进行复制?
-
noexcept(std::declval<std::stringstream>().str())
是。
- 内存和I/O不是无限的资源。很容易想到两种策略来处理资源不可用:抛出异常或终止应用程序。
- 是的,defaulted special member functions have implicit
nothrow(true)
exception specification when the conditions are met,即基类和成员对应的特殊成员函数也必须是nothrow(true)
.