免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 无风之谷
打印 上一主题 下一主题

让我欢喜让我忧——我的C++之路 [复制链接]

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
111 [报告]
发表于 2012-05-02 18:19 |显示全部楼层
回复 1203# 陈良乔

>> 关于page,就算是我看错了好不好,现在搞清楚了,你是想在每12页中找出一个错误(不知道你为什么要定这样一个奇怪的数字)

在你对同一段文字反复看错几次之前不可以说你是睁眼瞎,你自己定个标准吧。


>> 可是你又没兴趣找了,讨论这还有什么意义呢?

讨论这有什么意义?我可以反问陈同学你一句吗?你依然觉得为你这书找错误有意义吗?

以源代码做对比。
如果拿到一份代码,编译时只有几个error与(或)warning,才会有兴趣去改正这些编译错误与警告,并进一步推敲代码的正确性等等。
而如果拿到一份源代码,编译时error与warning刷刷地一个劲地冒…… 我不知道你是什么心情,反正我对这样的源代码是没兴趣去改进的。
推倒重来。

而你的书与源代码不同的地方是:即使你重来也还是这个熊样,所以只要推到就可以了。


因此,打从一开始就对"促进你的书的质量"没兴趣。
但你说我没兴趣就是误解我了,对推到你的书我可是有兴趣的,只是你不接那个赌注而已。



>> 我已经说过了,大家最好的子弹,应该是书中的错误,而不应该是左一个“坑爹”,又一个“睁眼瞎”

同上,找毛个错误,你这书直接埋掉算了。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
112 [报告]
发表于 2012-05-03 16:51 |显示全部楼层
我去,我给你的回复你到底看没有……

1. 当constexpr在编译时求值时,如何报告编译时错误
在7楼,通过插入一个只能在运行时求值表达式

2. constexpr的动机
在12楼



AD8018 发表于 2012-05-03 13:45
constexpr既然是了为编译时求职,
那么完全没必要支持运行时调用。将所有参数认为编译时的常数,应该是合理的。

你坚持认为"constexpr没有必要支持运行时调用"是合理的,请问有出处吗?还是你自己揣摩得出的结论?

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
113 [报告]
发表于 2012-05-03 18:18 |显示全部楼层
AD8018 发表于 2012-05-03 17:24
回复 1235# OwnWaterloo

不要误会,我这个不是标准。
只是觉得现在的做法不好,不支持运行时调用反而更好。
这是我期望看到的改进、不是标准。你也可以想各种点子,通常点子这东西,只能被人来评价好或不好。讨论出处,就不叫点子了。
好或不好,在乎各位的评价和有无适用性。

只支持运行时求值的有了 —— 普通函数
只支持编译时求值的也有了 —— template
增加一个与template相同的没意义啊……


AD8018 发表于 2012-05-03 17:24
回复 1235# OwnWaterloo

不但看了,还验证了。
gcc下的结果,使能assert,
assert会出现在运行时的代码里,这样达不到编译时计算assert的效果。
你所说的 “assert —— 或者其他的非编译时常量 —— 就会出错。”,这个情况是不会发生的。

没有把握的答案我会随便乱说嘛……
你的验证方式是什么?
你试试: typedef int check_succ[f("101")]; typedef int check_fail[f("12")];

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
114 [报告]
发表于 2012-05-03 18:19 |显示全部楼层
陈良乔 发表于 2012-05-03 17:22
看了大家的回帖
除了谩骂和诬蔑,还剩下些什么呢?

失望
我渴望的攻击我的最猛烈的炮弹,一直没有出现
真的很失望

地球不是围着你转的。你渴望的不一定是其他人渴望的。
当你说对其他人失望时,想过有多少人早就对你失望了没有?

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
115 [报告]
发表于 2012-05-03 19:14 |显示全部楼层
本帖最后由 OwnWaterloo 于 2012-05-03 19:15 编辑
AD8018 发表于 2012-05-03 18:29
2. typedef int check_succ[f("101")]; typedef int check_fail[f("12")];
    试过了,gcc 4.6.2下,编译没有报错。



编译器版本:

  1. gcc --version
  2. gcc (GCC) 4.6.2
复制代码
代码:

  1. #include <assert.h>

  2. constexpr int f(char const* s, int acc=0)
  3. {
  4.       return *s == 0
  5.                    ? acc
  6.                    : *s == '0' || *s == '1'
  7.                          ? f(s+1, *s-'0' + (acc << 1))
  8.                          : (assert(!"invalid digits"), -1);
  9. }


  10. typedef int array_success[f("10")];
  11. #ifdef ARRAY
  12. typedef int array_failure[f("12")];
  13. #endif


  14. enum {
  15.       enum_success = f("10"),
  16. #ifdef ENUM
  17.       enum_failure = f("12"),
  18. #endif
  19. };


  20. #ifdef NON_TYPE
  21. template<int> struct message {};
  22. message<f("10")> success;
  23. message<f("12")> faiture;
  24. #endif


  25. #ifdef CONST
  26. int const const_success = f("10");
  27. int const const_failure = f("12");
  28. #endif
复制代码
里面包含了一些常见的编译时技术计算所使用的构造。


如果将f("12")用作数组维度会报错:

  1. gcc -c -Wall -x c++ -std=c++0x -DARRAY
  2. error: size of array 'array_failure' is not an integral constant-expression
复制代码
而f("10")没问题。


如果将f("12")用作enum会报错:

  1. gcc -c -Wall -x c++ -std=c++0x -DENUM
  2.    in constexpr expansion of 'f(((const char*)"12"), 0)'
  3.    in constexpr expansion of 'f((s + 1u), ((((int)(* s)) + -0x000000030) + (acc << 1)))'
  4. error: 'void _assert(const char*, const char*, int)' is not a constexpr function

  5. error: enumerator value for 'enum_failure' is not an integer constant
复制代码
注意"_assert ... is not a constexpr function"。
而f("10") 没问题


如果将f("12")用作non-type参数会报错:

  1. gcc -c -Wall -x c++ -std=c++0x -DNON_TYPE
  2.    in constexpr expansion of 'f(((const char*)"12"), 0)'
  3.    in constexpr expansion of 'f((s + 1u), ((((int)(* s)) + -0x000000030) + (acc << 1)))'
  4. error: 'void _assert(const char*, const char*, int)' is not a constexpr function
  5. ...
复制代码
而f("10")没问题


而const比较麻烦,因为它并不向上面那几个,只能接受常量表达式。它的初始化可以接受非常量表达式。

  1. gcc -c -Wall -x c++ -std=c++0x -DCONST
  2. nm
  3. 00000000 t __Z41__static_initialization_and_destruction_0ii
  4. 00000000 b __ZL13const_failure
  5. 0000001c r __ZL13const_success
复制代码
const_success分配在rdata,可知它的值在编译时就已知了。
const_failure分配在bss,会被static_initialization_and_destruction在运行时初始化。



AD8018 发表于 2012-05-03 18:29
1. 有意义的
    实现 user-defined literals啊

"constexpr可接受运行时参数,整个表达式在运行时求值",这同样可以实现user-defined literal。并不矛盾。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
116 [报告]
发表于 2012-05-03 19:18 |显示全部楼层
陈良乔 发表于 2012-05-03 18:33
我本来想回复一段,但是后来想想算了
我一回复,又会被卷入无休止的毫无意义的道德讨伐中

我渴望大家多找几个错误出来,让我死得痛快一点吧,求求大家了
我很乐意提供制造炮弹的原料哦,给我发email


前面已经说了,你的渴望并不是其他人的渴望。
你渴望大家帮你找错误;但至少我渴望你干脆就别出这书了。

既然你不能满足我的渴望,我凭什么要满足你的渴望?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP