C++ 我可以在typedef函数签名中加入抛出声明吗?
是否可以声明包含抛出规范的函数指针?例如,我有以下功能:C++ 我可以在typedef函数签名中加入抛出声明吗?,c++,C++,是否可以声明包含抛出规范的函数指针?例如,我有以下功能: void without_throw() throw() { } 并希望创建一个函数,将其作为参数接受,并使用throw()部分完成。我已尝试将其添加到typedef,但似乎不起作用: typedef void (*without)() throw(); GCC给了我一个错误error:'without'声明了一个异常规范您不能定义它。标准中明确不允许这样做。(用noexcept替换它也没用,同样的问题。) 引用C++11草案n329
void without_throw() throw() {
}
并希望创建一个函数,将其作为参数接受,并使用throw()
部分完成。我已尝试将其添加到typedef
,但似乎不起作用:
typedef void (*without)() throw();
GCC给了我一个错误
error:'without'声明了一个异常规范
您不能定义它。标准中明确不允许这样做。(用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
–结束示例]
第二个示例允许您执行以下操作:
void foo() throw() {}
void bar() {}
int main()
{
void (*fa)() throw() = foo;
void (*fb)() throw() = bar; // error, does not compile
}
如果可以接受c++0x,也可以使用std::函数:
#include <functional>
void without_throw() throw() {}
typedef std::function<void() throw()> without;
int main()
{
without w = &without_throw;
w();
}
#包括
没有_throw()throw(){}的void
typedef std::函数没有;
int main()
{
不带w=&不带_-throw;
w();
}