为什么 std::runtime_error 的 c'tor 经常引用 std::string?



根据 cppreference.com 的说法,std::runtime_error的一个c'tors具有以下签名:

explicit runtime_error( const std::string& what_arg );

但是(我假设(无论如何都需要新构造的异常对象来保存该std::string参数的副本。那么为什么参数是由 const ref(而不是按值(给出的呢?

我的假设错了吗?

无论如何,

按值传递都没有用。不过,您可能正在考虑通过std::string&&。根据您发布的 cppreference.com 页面。

由于不允许复制 std::exception 引发异常,因此此消息通常在内部存储为单独分配的引用计数字符串。这也是为什么没有构造函数采用 std::string&&:无论如何它都必须复制内容。

std::runtime_error不应该保留std::string,因为如果它这样做,复制异常可能会导致另一个异常,因为无法为副本分配空间。避免这种情况的一种方法是使用引用计数缓冲区并将参数复制到该缓冲区。鉴于必须制作副本,std::string&&过载没有任何好处。

您应该始终将字符串作为常量引用。它避免了制作两个副本。

如果你接受它作为一个字符串,它必须首先构造它。然后,当将其放入类成员中时,它必须复制构造它。

对于移动操作来说,这可能不是那么低效,但我们中的一些人仍然必须为Visual Studio 2008或Redhat Linux 5编写C++代码,并且不能使用C++11,14或17。

除此之外,当创建 std::exception 时,C++ 标准中没有任何移动操作。

最新更新