Какова гарантия безопасности исключений для методов получения (по значению)?

Для следующего примера класса, каковы исключительная безопасность гарантии для методов получения?

Такие методы получения предлагают минимум надежной гарантии?

Всегда ли возврат фундаментального типа по значению всегда дает гарантию отсутствия броска?

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 методы, поэтому основной проблемой является утечка вновь созданного vectors — они должны быть освобождены автоматически, если есть исключение при копировании членов из c или же e к возвращаемому значению.

Причина того, что a должно быть правильно инициализировано, если копирование неинициализированных данных может привести к появлению таких архитектур, как Itanium, как описано в Ответ Вирсавии.

2

Другие решения

Нет никаких гарантий безопасности исключений вообще.

Например, getA() может вызвать исключение, если a не инициализируется (или делать что-либо еще в этом отношении, поскольку поведение будет неопределенным). Некоторые микросхемы (например, Itanium) сигнализируют о считывании унитаризованной переменной.

getC() мог бросить std::bad_alloc если у вас мало памяти. то же самое getB(), getD() а также getE(),

3

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector