2014-11-10 1 views
6

throw 사양을 포함하는 함수 포인터를 선언 할 수 있습니까? 예를 들어,이 기능이 있습니다typedef 함수 시그니처에 throw 선언을 넣을 수 있습니까?

void without_throw() throw() { 
} 

을 그리고 throw() 부분 전체 매개 변수로받는 함수를 만들 싶습니다. 나는 typedef에 추가 시도했지만, 그것은 작동하지 않습니다

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

GCC는 나에게 오류 error: ‘without’ declared with an exception specification을 제공합니다.

답변

7

당신은 그것을 typedef 할 수 없습니다. 명시 적으로 허용되지 않습니다. (그리고 noexcept와 그 대체하는 것은, 같은 문제를 도움이되지 않습니다.)

는 C++ 11 초안 n3290 (§15.4/2 예외 사양)

는 예외-사양 만에 표시하여야을 인용 함수 유형에 대한 함수 선언자, 함수 유형에 대한 포인터, 함수 유형에 대한 참조 또는 선언 또는 정의의 최상위 유형 인 멤버 함수 유형에 대한 포인터 또는 매개 변수 또는 리턴 유형으로 나타나는 유형에 대한 포인터 함수 선언자. 예외 명세는 typedef 선언이나 별칭 선언에 나타나면 안된다. [예 :

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

– 최종 예]

두 번째 예는이 같은 수행 할 수 있습니다 : C 경우

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

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

은 또한 당신이 표준 : 기능을 사용할 수 있습니다 ++ 0x 허용 가능 :

#include <functional> 

void without_throw() throw() {} 

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

int main() 
{ 
    without w = &without_throw; 
    w(); 
} 
관련 문제