11.4.1. Спецификации исключений и указатели на функции

11.4.1. Спецификации исключений и указатели на функции

Спецификацию исключений можно задавать и при объявлении указателя на функцию.

Например:

void (*pf)( int ) throw(string);

В этом объявлении говорится, что pf указывает на функцию, которая способна возбуждать только исключения типа string. Как и для объявлений функций, спецификации исключений в разных объявлениях одного и того же указателя не суммируются, они должны быть одинаковыми:

extern void (*pf) ( int ) throw(string);

// ошибка: отсутствует спецификация исключения

void (*pf)( int );

При работе с указателем на функцию со спецификацией исключений есть ограничения на тип указателя, используемого в качестве инициализатора или стоящего в правой части присваивания. Спецификации исключений обоих указателей не обязаны быть идентичными. Однако на указатель-инициализатор она должна накладывать столь же или более строгие ограничения, чем на инициализируемый указатель (или тот, которому присваивается значение). Например:

void recoup( int, int ) throw(exceptionType);

void no_problem() throw();

void doit( int, int ) throw(string, exceptionType);

// правильно: ограничения, накладываемые на спецификации

// исключений recoup() и pf1, одинаковы

void (*pf1)( int, int ) throw(exceptionType) =

// правильно: ограничения, накладываемые на спецификацию исключений no_problem(),

более строгие,

// чем для pf2

void (*pf2)( ) throw(string) = &no_problem;

// ошибка: ограничения, накладываемые на спецификацию

// исключений doit(), менее строгие, чем для pf3

//

void (*pf3)( int, int ) throw(string) =

Третья инициализация не имеет смысла. Объявление указателя гарантирует, что pf3 адресует функцию, которая может возбуждать только исключения типа string. Но doit() возбуждает также исключения типа exceptionType. Поскольку она не подходит под ограничения, накладываемые спецификацией исключений pf3, то не может служить корректным инициализатором для pf3, так что компилятор выдает ошибку.

Упражнение 11.9

В коде, разработанном для упражнения 11.8, измените объявление оператора operator[]() в классе IntArray, добавив спецификацию возбуждаемых им исключений. Модифицируйте программу так, чтобы operator[]() возбуждал исключение, не указанное в спецификации. Что при этом происходит?

Упражнение 11.10

Какие исключения может возбуждать функция, если ее спецификация исключений имеет вид throw()? А если у нее нет такой спецификации?

Упражнение 11.11

Какое из следующих присваиваний ошибочно? Почему?

void example() throw(string);

(a) void (*pf1)() = example;

(b) void (*pf2) throw() = example;

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

R.7.1 Спецификации

Из книги Справочное руководство по C++ автора Страустрап Бьярн

R.7.1 Спецификации В описании можно использовать следующие спецификации:спецификация-описания: спецификация-класса-памяти спецификация-типа спецификация-fct спецификация-шаблона-типа friend typedefспецификации-описания: спецификации-описания opt спецификация-описанияСамая


R.7.4 Спецификации связи

Из книги Искусство программирования для Unix автора Реймонд Эрик Стивен

R.7.4 Спецификации связи С помощью спецификации-связи можно связать (§R.3.3) фрагменты программ на C++ и на другом языке:спецификация-связи: extern строка-литерал { список-описаний opt } extern строка-литерал описаниесписок-описаний: описание список-описаний описаниеТребуемое


17.4. Спецификации — ДНК, код — РНК

Из книги Эффективное использование C++. 55 верных способов улучшить структуру и код ваших программ автора Мейерс Скотт

17.4. Спецификации — ДНК, код — РНК Даже в давние времена PDP-7 Unix-программисты всегда (больше чем их коллеги, работающие с другими системами) были склонны рассматривать старый код как непригодный к повторному использованию. Это, несомненно, было продуктом Unix-традиции,


Правило 25: Подумайте о поддержке функции swap, не возбуждающей исключений

Из книги Искусство программирования для Unix автора Реймонд Эрик Стивен

Правило 25: Подумайте о поддержке функции swap, не возбуждающей исключений swap – интересная функция. Изначально она появилась в библиотеке STL и с тех пор стала, во-первых, основой для написания программ, безопасных в смысле исключений (см. правило 29), а во-вторых, общим


17.4. Спецификации — ДНК, код — РНК

Из книги TCP/IP Архитектура, протоколы, реализация (включая IP версии 6 и IP Security) автора Фейт Сидни М

17.4. Спецификации — ДНК, код — РНК Даже в давние времена PDP-7 Unix-программисты всегда (больше чем их коллеги, работающие с другими системами) были склонны рассматривать старый код как непригодный к повторному использованию. Это, несомненно, было продуктом Unix-традиции,


4.12 Сети по спецификации 802

Из книги XSLT автора Хольцнер Стивен

4.12 Сети по спецификации 802 После того как DIX Ethernet и другие технологии локальных сетей доказали на компьютерном рынке свою полезность, IEEE организовала комитет 802 по разработке и публикации стандартов для технологий локальных сетей.Стандарты из серии 802, объединяющие


Спецификации W3C

Из книги CSS3 для веб-дизайнеров автора Сидерхолм Дэн

Спецификации W3C W3C выпускает спецификации как для XML, так и для XSL, и именно с ними мы будем работать на протяжении всей книги. Спецификации W3C не называются стандартами, поскольку, по международным соглашениям, стандарты могут создаваться только уполномоченными


Модификаторы спецификации преобразования, используемые в функции printf( )

Из книги C++ для начинающих автора Липпман Стенли

Модификаторы спецификации преобразования, используемые в функции printf( )      Мы можем несколько расширить основное определение спецификации преобразования, поместив модификаторы между знаком % и cимвoлoм, определяющим тип преобразования. В приводимой ниже таблице дан


ФУНКЦИИ, МАССИВЫ И УКАЗАТЕЛИ

Из книги автора

ФУНКЦИИ, МАССИВЫ И УКАЗАТЕЛИ      Массивы можно использовать в программе двояко. Во-первых, их можно описать в теле функции. Во-вторых, они могут быть аргументами функции. Вес, что было сказано в этой главе о массивах, относится к первому их применению; теперь рассмотрим


Не читайте спецификации

Из книги автора

Не читайте спецификации Зайдите в комнату, наполненную веб-дизайнерами, и спросите их: «Кто любит читать спецификации?» Возможно, вы увидите одну поднятую руку. (Если этот человек – вы, то я горжусь вами и свободным временем, которое у вас есть, по всей видимости.) Пусть они


7.9. Указатели на функции

Из книги автора

7.9. Указатели на функции Предположим, что нам нужно написать функцию сортировки, вызов которой выглядит так:sort( start, end, compare );где start и end являются указателями на элементы массива строк. Функция sort() сортирует элементы между start и end, а аргумент compare задает операцию сравнения


7.9.6. Указатели на функции, объявленные как extern "C"

Из книги автора

7.9.6. Указатели на функции, объявленные как extern "C" Можно объявлять указатели на функции, написанные на других языках программирования. Это делается с помощью директивы связывания. Например, указатель pf ссылается на С-функцию:extern "C" void (*pf)(int);Через pf вызывается функция,


9.1.6. Указатели на перегруженные функции A

Из книги автора

9.1.6. Указатели на перегруженные функции A Можно объявить указатель на одну из множества перегруженных функций. Например:extern void ff( vectordouble );extern void ff( unsigned int );// на какую функцию указывает pf1?void ( *pf1 )( unsigned int ) = ff;Поскольку функция ff() перегружена, одного инициализатора ff


19.2.6. Спецификации исключений

Из книги автора

19.2.6. Спецификации исключений С помощью спецификации исключений (см. раздел 11.4) в объявлении функции указывается множество исключений, которые она может возбуждать прямо или косвенно. Спецификация позволяет гарантировать, что функция не возбудит не перечисленные в ней