免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
1241 [报告]
发表于 2012-05-03 17:46 |只看该作者
pmerofc 发表于 2012-05-03 17:39
微软再怎么着也不至于堕落如斯吧
竟然需要这样一本书来推广吗?

说的是,那么理应不会让没有资质的人拿着他们给的名头唬人。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
1242 [报告]
发表于 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
1243 [报告]
发表于 2012-05-03 18:19 |只看该作者
陈良乔 发表于 2012-05-03 17:22
看了大家的回帖
除了谩骂和诬蔑,还剩下些什么呢?

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

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

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
1244 [报告]
发表于 2012-05-03 18:20 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
1245 [报告]
发表于 2012-05-03 18:29 |只看该作者
OwnWaterloo 发表于 2012-05-03 18:18
只支持运行时求值的有了 —— 普通函数
只支持编译时求值的也有了 —— template
增加一个与template相 ...


1. 有意义的
    实现 user-defined literals啊

2. typedef int check_succ[f("101")]; typedef int check_fail[f("12")];
    试过了,gcc 4.6.2下,编译没有报错。

论坛徽章:
0
1246 [报告]
发表于 2012-05-03 18:33 |只看该作者
本帖最后由 陈良乔 于 2012-05-03 18:37 编辑
OwnWaterloo 发表于 2012-05-03 18:19
地球不是围着你转的。你渴望的不一定是其他人渴望的。
当你说对其他人失望时,想过有多少人早就对你失望 ...


我本来想回复一段,但是后来想想算了
我一回复,又会被卷入无休止的毫无意义的道德讨伐中

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

论坛徽章:
0
1247 [报告]
发表于 2012-05-03 18:35 |只看该作者
pmerofc 发表于 2012-05-03 18:20
回复 1240# Reallsc

嗯,外国的月亮就是要比中国的圆一些啊

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

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


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

既然你不能满足我的渴望,我凭什么要满足你的渴望?

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
1250 [报告]
发表于 2012-05-03 20:05 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP