2014-11-10 2 views
6

Можно ли объявить указатель на функцию, включая спецификацию throw? Например, у меня есть эта функция:Могу ли я помещать объявление броска в подпись функции typedef?

void without_throw() throw() { 
} 

И хотел бы создать функцию, которая принимает его в качестве параметра, в комплекте с throw() части. Я пытался добавить его в typedef, но это не похоже на работу:

typedef void (*without)() throw(); 

GCC дает мне ошибку error: ‘without’ declared with an exception specification.

ответ

7

Вы не можете напечатать это. В стандарте это явно запрещено. (А что с заменой noexcept не помогает, та же проблема.)

Цитирование C++ 11 проектов n3290 (§15.4/2 спецификации исключений)

Исключение-спецификация должна появляться только на декларатор функции для типа функции, указатель на тип функции, ссылку на тип функции или указатель на тип функции-члена, который является типом объявления верхнего уровня или определением, или на такой тип, который появляется как параметр или тип возврата в декларатор функции. Спецификация исключения не должна появляться в объявлении typedef или декларации alias. [Пример:

void f() throw(int);   // OK 
void (*fp)() throw (int);  // OK 
void g(void pfa() throw(int)); // OK 
typedef int (*pf)() throw(int); // ill-formed 

– конец пример]

Второй пример позволяет сделать что-то вроде этого:

void foo() throw() {} 
void bar() {} 

int main() 
{ 
    void (*fa)() throw() = foo; 
    void (*fb)() throw() = bar; // error, does not compile 
} 
2

Также вы можете использовать зЬй :: функцию, если C++ 0x приемлемо:

#include <functional> 

void without_throw() throw() {} 

typedef std::function<void() throw()> without; 

int main() 
{ 
    without w = &without_throw; 
    w(); 
} 
Смежные вопросы