| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1805 人关注过本帖
标题:关于异常规范与函数指针的疑问
只看楼主 加入收藏
songhuirong1
Rank: 2
等 级:论坛游民
帖 子:116
专家分:38
注 册:2010-6-15
结帖率:94.12%
收藏
已结贴  问题点数:20 回复次数:7 
关于异常规范与函数指针的疑问
大家看到C++ Primer第三版的第465页,上面有段话是这么说的。

当带有异常规范的函数指针被初始化或被赋值时对于用作初始值或用作赋值右
边的右值的指针类型有一些限制这两个指针的异常规范不必完全一样但是用作初始
值或右值的指针异常规范必须与被初始化或赋值的指针异常规范一样或更严格例如
void recoup( int, int ) throw(exceptionType);
void no_problem() throw();
void doit( int, int ) throw(string, exceptionType);
// ok: recoup() 与 pf1 的异常规范一样严格
void (*pf1)( int, int ) throw(exceptionType) = &recoup;
// ok: no_problem() 比 pf2 更严格
void (*pf2)() throw(string) = &no_problem;
// 错误: doit()没有 pf3 严格
void (*pf3)( int, int ) throw(string) = &doit;
第三个初始化没有意义该指针的声明保证pf3 指向一个函数该函数不会抛出除了
string 类型之外的任何异常但是函数doit()可能抛出一个exceptionType 类型的异常因为
函数doit()不能满足pf3 的异常规范的保证所以函数doit()不是pf3 的合法初始值因而
会产生一个编译错误


按照它这个说法,再看下面的小练习。

练习 11.11
下列哪些指针赋值是错误的为什么?
void example() throw(string);
(a) void (*pf1)() = example;
(b) void (*pf2)() throw() = example;

那么我认为(b)编译是通不过的,但是我在vs中编译了下,结果却是这样的,这是为何呀?求高人指点。

1>------ 已启动生成: 项目: CP11, 配置: Debug Win32 ------
1>正在编译...
1>lx11-11.cpp
1>f:\program files\source\cp11\cp11\lx11-11.cpp(5) : warning C4290: 忽略 C++ 异常规范,但指示函数不是 __declspec(nothrow)
1>生成日志保存在“file://f:\Program Files\source\CP11\CP11\Debug\BuildLog.htm”
1>CP11 - 0 个错误,1 个警告
========== 生成: 成功 1 个,失败 0 个,最新 0 个,跳过 0 个 ==========

编译能通过,这和书上说的不是不一样了吗?
搜索更多相关主题的帖子: 异常 
2010-12-29 13:40
lintaoyn
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:606
专家分:2499
注 册:2009-4-8
收藏
得分:10 
warning C4290: 忽略 C++ 异常规范,但指示函数不是 __declspec(nothrow)
不是有给你个警告么,编译器不一定要全部支持C++标准。

迭代的是人,递归的是神。
2010-12-29 14:18
songhuirong1
Rank: 2
等 级:论坛游民
帖 子:116
专家分:38
注 册:2010-6-15
收藏
得分:0 
回复 楼主 songhuirong1
那这个在语法上有错不?
2010-12-29 16:49
songhuirong1
Rank: 2
等 级:论坛游民
帖 子:116
专家分:38
注 册:2010-6-15
收藏
得分:0 
回复 2楼 lintaoyn
那这在语法上有错吗?
2010-12-29 16:50
lintaoyn
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:606
专家分:2499
注 册:2009-4-8
收藏
得分:10 
你用的编译器认为这语法是正确的。

迭代的是人,递归的是神。
2010-12-29 17:36
songhuirong1
Rank: 2
等 级:论坛游民
帖 子:116
专家分:38
注 册:2010-6-15
收藏
得分:0 
回复 5楼 lintaoyn
但是vs 2008忽略了这个异常规范,这在程序的其它部分会产生影响吗?
2010-12-30 09:03
lintaoyn
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:606
专家分:2499
注 册:2009-4-8
收藏
得分:0 
自己写代码测试下。
就现在写的代码的规模,指定函数只能抛出什么异常也没啥用处。

迭代的是人,递归的是神。
2010-12-30 09:20
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
理论上应该有語法错误。但实现时一般不会做的像标准说的那么严格。

因为标准有一系列规定,指出了在抛出超出指定类型的异常时的处理方式。另外标准明确声明了,那个异常声明列表不属于函数类型的一部分。所以这个类型审查有时会弱化也可以理解。不过不要用这个利用这个性质,再怎么说这种手段是一种提高安全性的方法,而不是一种增加代码混乱度的方法。

我试了试,gcc 也不认为那語句有語法错误。
2010-12-31 19:49
快速回复:关于异常规范与函数指针的疑问
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017020 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved