Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我可以在typedef函数签名中加入抛出声明吗?_C++ - Fatal编程技术网

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();
}