пятница, 3 сентября 2010 г.

Function try block

Думаю, многие применяли try-catch блоки для ловли исключений. Однако, есть у этих блоков одна малоизвестная особенность введенная в стандарт в 1995 году. Называется function-try-block и применяется, в основном, для того, чтобы поймать исключения в списке инициализации конструктора. Рассмотрим небольшой пример:
struct A
{
private:
  std::string s;
public:
  A( int value ) : s( boost::lexical_cast<std::string>( value ) ) {}
};

Что будет с данным кодом, если boost::lexical_cast вдруг выкинет исключение? А будет то, что экземпляр класса A не создастся. Это может быть совсем не то, что мы хотим. Как раз для таких целей и нужен function-try-block. Выглядить это будет так:
struct A
{
private:
  std::string s;
public:
  A( int value ) try : s( boost::lexical_cast<std::string>( value ) ) {}
  catch ( boost::bad_lexical_cast ) { /* handle lexical_cast exception here */ }
};

Обратите внимание в каком месте находится ключевое слово try.

среда, 1 сентября 2010 г.

До нового стандарта осталось чуть

Надоело называть новый стандарт C++0x? Так вот Саттер пишет, что, вероятно, уже в марте будут подчищены последние нестыковки и стандарт будет выпущен под именем C++11. Самое замечательное из последней встрече комитета по стандарту С++ — это решение, что деструкторы будут noexcept по умолчанию. Это будет подсказкой для новичков в программировании. Я бы ещё сделал, чтобы все конструкторы были explicit по умолчанию, но это порушит совместимость между стандартами.