繁体   English   中英

函数指针中的c ++异常规范

[英]c++ exception specification in a function pointer

码:

#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异常规范与函数指针pf不同,也可以将foo传递给pf 这是我的编译器中的错误吗?

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

遵循Herb Sutter的建议以及例外规范:

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

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

是的,这是编译器错误。 函数指针必须具有可分配的兼容异常说明符。

从标准报价:

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 
    ^

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM