对于以下示例类,getter方法的exception safety保证是什么?
这种吸气方法是否提供了最低限度的保证?
按值返回基本类型总是提供无投保证吗?
class Foo
{
public:
// TODO: Constructor
// Getter methods
int getA() const { return a; }
std::string getB() const { return b; }
std::vector<int> getC() const { return c; }
Bar getD() const { return d; }
std::vector<Bar> getE() const { return e; }
protected:
int a;
std::string b;
std::vector<int> c;
Bar d;
std::vector<Bar> e;
}
答案 0 :(得分:3)
根本不保证例外安全。
例如,getA()
可能会在a
未初始化时抛出异常(或者为此事做任何其他事情,因为行为将是未定义的)。如果读取了一个单元化变量,一些芯片(例如Itanium)会发出信号。
getC()
可能会抛出std::bad_alloc
。同上getB()
,getD()
和getE()
。
答案 1 :(得分:2)
我认为您的所有操作都满足强大的异常安全性,并提供(如果相关)Bar(const Bar&)
复制构造函数是非常安全的。此外,getA
将满足nothrow保证,前提是a
已初始化,例如在构造函数中。
这些Foo
方法没有修改const
的任何部分,因此主要关注的是新创建的vector
的泄漏 - 如果存在异常,则应自动解除分配将成员从c
或e
复制到返回值。
必须正确初始化a
的原因是复制未初始化的数据可能会引发Itanium等体系结构,如Bathsheba's answer中所述。