[英]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.