是否可以声明包含throw规范的函数指针?例如,我有这个功能:
void without_throw() throw() {
}
并且想要创建一个接受它作为参数的函数,并使用throw()
部分。我已尝试将其添加到typedef
,但这似乎无效:
typedef void (*without)() throw();
GCC给了我错误error: ‘without’ declared with an exception specification
。
答案 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();
}