我正在编写一个小型库,它可以执行一些在输入参数超出范围时可能会引发异常的操作。似乎很简单,我会抛出一个 std::out_of_range。
我还想生成一个很好的消息,例如“你给了我 X,但 Y 是范围内的最大值”——即我正在格式化一个字符串,并希望将其用于异常。
奇怪的是构造函数的签名是
显式超出范围(const string& what_arg)
也就是说,它采用对字符串的 const 引用。当我们从函数中弹出时,我在堆栈上创建的任何字符串都将被销毁,为异常捕获器留下一堆乱七八糟的垃圾。所以我只有几个选择:
- 使用字符串字面量,因此不会生成好的消息。它在程序的生命周期内有效。
- 在函数中将字符串设为静态,并在抛出时重写。线程安全对我的程序来说不是问题,但这感觉很脏。
- 子类 out_of_range 以便它获取字符串的拷贝,并使用对拷贝的引用调用父类(super class)构造函数,以便该拷贝在异常对象的生命周期内存在。
我倾向于 3 作为最不严重的,并且可以说是比直接使用标准类更好的设计,但我不得不问:真的没有办法直接使用标准的 out_of_range 类和生成的字符串吗?我错过了什么吗?
最佳答案
异常将保留您传入的字符串的拷贝,而不仅仅是引用。您可以安全地在本地创建字符串并将其传递给异常的构造函数,而不必担心生命周期问题。
请注意,字符串通过引用传递的事实并不抑制在构造函数内部进行复制的可能性,这似乎让您感到困惑。
关于c++ - 使用非文字字符串抛出 out_of_range 异常。什么是较小的邪恶?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11942169/