我可以在一个typedef函数签名中放入一个throw声明吗?

时间:2014-11-10 07:06:06

标签: c++

是否可以声明包含throw规范的函数指针?例如,我有这个功能:

void without_throw() throw() {
}

并且想要创建一个接受它作为参数的函数,并使用throw()部分。我已尝试将其添加到typedef,但这似乎无效:

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

GCC给了我错误error: ‘without’ declared with an exception specification

2 个答案:

答案 0 :(得分:7)

你不能输入那个。标准中明确禁止这样做。 (并用noexcept替换它也无济于事。)

引用C ++ 11草案n3290(§15.4/ 2 例外规范

  

异常规范只出现在函数类型的函数声明符,函数类型的指针,函数类型的引用或成员函数类型的指针上,该成员函数类型是声明或定义的顶级类型,或者是这样的类型在函数声明符中显示为参数或返回类型。异常规范不应出现在typedef声明或alias-declaration中。 [例如:

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
}

答案 1 :(得分:2)

如果c ++ 0x可以接受,你也可以使用std :: function:

#include <functional>

void without_throw() throw() {}

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

int main()
{
    without w = &without_throw;
    w();
}