模板之小试牛刀---我有点明白为什么这么多人骂c++了

来源:互联网 发布:mysql的存储引擎 编辑:程序博客网 时间:2024/05/07 02:18

有朋友让我写一个模版算素数的程序,我也好久没用模版了,就当是热手。结果让我非常非常郁闷。

另外附带写了算整数平方根,因为素数判断时要用。下面有4个测试宏,分别是打印素数,打印素数个数,打印是否是素数,打印整数平方根。

 

 

很意外的发现,编译时运算居然不支持逻辑运算短路。也就是说编译时运算结果已经在常数表达式左边算出,逻辑运算依然要强行算完剩下的。

 

以prime_check(检查是否是素数)为例,

prime = D == 1 ? 

true :   N % D == 0 ? 

false : prime_check<N , D - 1>::prime  

 

当D=1时,prime的结果就可以获得。然而编译器会不必要的强行把整个表达式算完。于是如果没有对D=1作偏特化,编译器便会无限制的进行递归展开,直到展开过深报错。我不得不添加了一个其实根本没用的偏特化prime_check<N , 1>,并放弃使用vc6改用其他支持偏特化的编译器。我一时身边能找到的g++, intel, codepad.org等编译器都是完全相同的行为。

 

事实上我并不知道编译器是真的去计算prime_check<N , D - 1>::prime呢,还是仅仅把prime_check<N , D - 1>实例化。总之在逻辑运算之外产生了完全没有必要的副作用。我先后试了&&,||,?:,都是完全相同的结果。

 

最让人不可接受的是:预处理的#if逻辑运算支持短路,运行时的&&,||,?:逻辑运算支持短路,但是在这2个阶段中间的编译阶段却不支持(这算是c++自己搞出来的)。你说凭什么让程序员不骂制定c++标准的人白痴?