关于异常规范与函数指针的疑问
大家看到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 个 ==========
编译能通过,这和书上说的不是不一样了吗?