Какова гарантия безопасности исключений для методов получения (по значению)?
Для следующего примера класса, каковы гарантии безопасности исключений для методов получения?
Такие методы получения предлагают минимум надежной гарантии?
Всегда ли возврат фундаментального типа по значению всегда дает гарантию отсутствия броска?
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;
}
2 ответа
Я думаю, что все ваши операции удовлетворяют строгим требованиям безопасности при условии, что Bar(const Bar&)
Конструктор копирования полностью безопасен. Дополнительно, getA
будет удовлетворять гарантию nothrow, при условии, что a
инициализируется, например, в конструкторе.
Нет части Foo
модифицируется этими const
методы, поэтому основной проблемой является утечка вновь созданного vector
s - они должны быть освобождены автоматически, если есть исключение при копировании членов из c
или же e
к возвращаемому значению.
Причина того, что a
должно быть правильно инициализировано, если копирование неинициализированных данных может привести к появлению таких архитектур, как Itanium, как описано в ответе Вирсавии.
Нет никаких гарантий безопасности исключений вообще.
Например, getA()
может вызвать исключение, если a
не инициализируется (или делать что-либо еще в этом отношении, поскольку поведение будет неопределенным). Некоторые микросхемы (например, Itanium) выдают сигнал, если читается унифицированная переменная.
getC()
мог бросить std::bad_alloc
если у вас мало памяти. то же самое getB()
, getD()
а также getE()
,