2

我正在编写一个小型库,当输入参数超出范围时,它会执行一些可能引发异常的事情。我会抛出一个 std::out_of_range 似乎很简单。

我还想生成一个很好的消息,例如“你给了我 X,但 Y 是范围内的最大值” - 即我正在格式化一个字符串并希望将它用于异常。

奇怪的是构造函数的签名是

explicit out_of_range (const string& what_arg)

也就是说,它需要对字符串的 const 引用。当我们从函数中弹出时,我在堆栈上创建的任何字符串都将被销毁,为异常捕获器留下一堆乱七八糟的垃圾。所以我只有几个选择:

  1. 使用字符串文字,因此不会生成好的消息。它在程序的生命周期内有效。
  2. 在函数中将字符串设为静态,并在抛出时重写。线程安全对我的程序来说不是问题,但这感觉很脏。
  3. 子类 out_of_range 以便它获取字符串的副本,并使用对副本的引用调用超类构造函数,以便副本在异常对象的生命周期内存在。

我倾向于 3 作为最不严重的,并且可以说是比直接使用标准类更好的设计,但我不得不问:真的没有办法直接使用标准的 out_of_range 类和生成的字符串吗?我错过了什么吗?

4

3 回答 3

6

异常将保存您传入的字符串的副本,而不仅仅是引用。您可以安全地在本地创建字符串并将其传递给异常的构造函数,而不必担心生命周期问题。

请注意,字符串是通过引用传递的这一事实并不会抑制在构造函数内部进行复制的可能性,这似乎让您感到困惑。

于 2012-08-13T20:58:48.573 回答
3

你的假设是错误的。想象一下这个类:

struct Foo
{
    std::string s;
    Foo(std::string const & str) : s(str) { }
};

你能看一下构造函数并得出结论,Foo a(std::string("hello"));创建一个悬空引用吗?

于 2012-08-13T20:59:06.280 回答
1

您的what_arg参数将被复制到 ctor 中的异常成员中。

于 2012-08-13T21:01:51.707 回答