首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

错误说明

2012-04-06 
异常说明#include iostream#include memory#include stdexcept#include stringusing namespace st

异常说明
#include <iostream>
#include <memory>
#include <stdexcept>
#include <string>

using namespace std;

void recoup(int) throw(runtime_error) {}

void (*pf1)(int) throw(runtime_error) = recoup;

void (*pf2)(int) throw(runtime_error, logic_error) = recoup;
/*书上的原话:
指针声明指出,pf3指向不抛出任何异常的函数,但是recoup函数指向能
抛出runtime_error类型的异常,recoup函数抛出的异常类型超出了pf3所制定的
对pf3而言,recoup函数不是有效的初始化式,并且会引发一个编译时错误
*/
void (*pf3)(int) throw() = recoup;

void (*pf4)(int) = recoup;

//但是在gcc下没有给任何警告和错误。为什么?
int main()
{


}




[解决办法]
在不同的机器上编译的结果不同,不同的编译选项结果也不同
我在HP机器上很多都是正常通过,但是在Sun上会出现很多错误
不过感觉这样解释这个问题不太明智,还是等待高人来
[解决办法]
这个问题只能这么说,标准是这么规定的,规定异常说明是函数接口的一部分,函数定义以及该函数的任意声明必须具有相同的异常说明。
在用另一指针初始化带异常说明的函数的指针,或者将后者赋值给函数地址的时候,两个指针的异常说明不必相同,但是,源指针的异常说明必须至少与目标指针的一样严格。
编译能通过只能说是编译器厂商没有遵守标准。
真要说明这个问题,必须清楚异常说明函数同普通函数经name mangling 后名字有什么区别。不同编译器的做法是不相同的。
所以没必要在这个问题上搞下去,你知道就行。
[解决办法]
赵老师说要相信编译器,不要迷信书
[解决办法]
根据《C++编程规范:101...》,忘掉异常说明!永远不要在自己的代码里使用它。

热点排行