4

代码:

#include<iostream>
using namespace std;

void foo() throw(char) {throw 'a';}

int main() try {

   void (*pf)() throw(float);
   pf = foo; // This should NOT work 
   pf();

}
catch(const char& c){cout << "Catched ::> " << c << endl;}

为什么即使异常规范与函数指针所具有的不同,也可以传递foo给?这是我的编译器中的错误吗?pffoopf

4

2 回答 2

9

异常规范不参与函数的类型。 更正:正如其他答案中所指出的,这确实是一个编译器错误。众所周知,大多数编译器在实现异常规范方面存在缺陷。此外,它们在 C++11 中已被弃用。所以,

遵循 Herb Sutter 的异常规范建议:

道德#1:永远不要编写异常规范。

道德#2:除了可能是一个空的,但如果我是你,我什至会避免。

于 2012-10-29T16:17:10.633 回答
5

是的,这是编译器错误。函数指针必须具有兼容的异常说明符才能赋值。

引用标准:

15.4 异常规范

(5) ...类似的限制适用于函数指针、成员函数指针和函数引用的赋值和初始化:目标实体应至少允许赋值或初始化中源值允许的异常。

例子:

class A;

void (*pf1)(); // no exception specification
void (*pf2)() throw(A);

pf1 = pf2; // OK: pf1 is less restrictive
pf2 = pf1; // error: pf2 is more restrictive

您使用Comeau编译的代码会incompatible exception specifications出现错误:

Comeau C/C++ 4.3.10.1 (Oct  6 2008 11:28:09) for ONLINE_EVALUATION_BETA2
Copyright 1988-2008 Comeau Computing.  All rights reserved.
MODE:strict errors C++ C++0x_extensions

"ComeauTest.c", line 9: error: incompatible exception specifications
  pf=foo; // This should NOT work 
    ^

正如许多其他人提到的,除了规范之外,C++11 标准(参见附录 D.4)中已弃用异常noexcept规范。所以最好的做法是(并且曾经) -避免使用它

于 2012-10-29T16:36:45.820 回答