C_and_CPP 板


LINE

之前有人发现 C++11/14/17 标准有个漏洞, 透过 friend + template + noexcept 可以让一个 constexpr expression 有不同的值 原理大概是这样的: ============================================================================== constexpr function 可以是有定义或没定义,这会影响到 noexcept 和 SFINAE 的结果: constexpr void f(); constexpr void g() {}; constexpr bool a = noexcept(f()); // false constexpr bool b = noexcept(g()); // true 如果我们可以控制一个 constexpr function 有无定义, 就可以将他当作一个 bit 来使用, 这点可以用 template + friend function 给定义达成: constexpr void flag(int); // 宣告 flag template<typename T> struct writer { friend void flag(T) {} // 当 writer<int> 被 instatinate 时,会定义 void flag(int) }; constexpr bool a = noexcept(flag(0)); // false writer<int> w; // instatinate `writer<int>` constexpr bool b = noexcept(flag(0)); // true static_assert(a != b); int main() { std::cout << a << ' ' << b << std::endl; // 0 1 } http://coliru.stacked-crooked.com/a/a6cc0faeb9f215c8 有了这鬼东西以後,就可以做出 compile-time 的 counter : static_assert(next() != next()); http://coliru.stacked-crooked.com/a/648448a3a8d03275 稍微包装一下就可以做出 constify 的功能: begin_mutable_region(r); // 宣告 r auto x = r::make<int>(1); auto v = r::make<std::vector<int>>(); x.get() = 42; // 修改 x v.get().emplace_back(42); // 修改 v end_mutable_region(r); // 之後不可再修改透过 r::make 制造出来的东西 x.get() = 43; // Error v.get().clear(); // Error std::cout << x << std::endl; // 还是可以透过 const int& 存取 x http://coliru.stacked-crooked.com/a/3d63a2e82c173055 其原理就是透过设定 r 当作旗标,若 r 被设立时就关闭 non-const 的 overload 不过这个技巧被 C++ 委员会认为是 ill-formed: https://wg21.cmeerw.net/cwg/issue2118 所以未来应该会修改标准禁止这鬼东西,至於具体要怎麽做现在似乎还没有提案 参考: Non-constant constant expressions in C++: http://b.atch.se/posts/non-constant-constant-expressions/ How to implement a constant-expression counter in C++ http://b.atch.se/posts/constexpr-counter/ 用 stateful metaprogramming 模拟 Rust 的 borrow checker: https://medium.com/@bhuztez/db4b5e94449f https://github.com/bhuztez/borrow --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.113.193.217
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1505626198.A.ED9.html
1F:推 CoNsTaR: XDD 09/17 14:23
2F:推 LPH66: 推一个, 不过我还满好奇这要怎麽改... 09/17 15:15
※ 编辑: PkmX (140.113.193.217), 09/17/2017 15:36:12
3F:→ jimfan: 可能我差劲吧,觉得C++变得复杂到不行 09/17 16:48
4F:→ windows2k: 不只C++啊..所有程式语言都越变越复杂, 需求越来越高 09/17 18:44
5F:→ windows2k: C#8, Java9, PHP7..几十年前程式语言哪有版号的观念 09/17 18:45
6F:→ uranusjr: C++ 的问题一直都是太多东西大杂烩, 不是复杂是主题太多 09/17 18:46
7F:推 stucode: C++ 威力强,可是涵盖层面广,难以驾驭精通。 09/17 19:46
8F:→ Lordaeron: 加了这一堆东西,会比较强? 哪之前的人有什麽写不出来? 09/17 21:21
9F:→ Lordaeron: 不明着没事找事. 09/17 21:21
10F:→ uranusjr: 其实新东西大体上还是不错, 是旧包袱甩不掉 09/17 21:37
11F:→ uranusjr: 旧的语法实在是太多雷再不改真的要被取代了 09/17 21:38
12F:→ Lordaeron: 新的语法雷有比较少? 09/17 23:43
13F:推 holydc: 组语有什麽东西写不出来?要高阶语言做什麽 09/17 23:58
14F:→ xam: 我觉得难的 template 已经很复杂了,但C++11/14里那只是基本 09/18 00:26
15F:推 steve1012: 更expressive 有啥不好 你可以选择不要用啊 09/18 00:38
16F:→ Ommm5566: 会比较强 c++11以来多了很多强力工具 09/18 06:39
17F:→ Ommm5566: move semantics/auto/lambda/shared_ptr...... 09/18 06:41
18F:→ Ommm5566: 程式码可以选择跑更快or比较好读or好维护 09/18 06:41
19F:→ Ommm5566: 不想用这些东西就写成c like阿 if+while+pointer+struct 09/18 06:45
20F:→ ronin728: C++就是洪拳啊,虎形鹤形蛇形螳螂形南少林花拳全加一块 09/18 08:03
21F:推 CoNsTaR: 有这个东东可以用 我都对tmp重新燃起希望了 拜托不要修 09/18 08:41
22F:→ CoNsTaR: 掉啦 QQ 09/18 08:41
23F:推 sppmg: holydc +1 ,我直觉也是asm XD 09/18 10:31
24F:→ Lordaeron: 鬼扯ASM,就已经不是在讨论问题了。 09/18 11:46
25F:→ Lordaeron: C++多了一大堆,然後有人说,你可以C like 啊 09/18 11:47
26F:→ Lordaeron: 哪没问题啊,何苦搞哪麽多?一来雷没变少,二来反而变多 09/18 11:48
27F:→ Lordaeron: 各家的实作又不尽一致,何不修正旧有的问题? 09/18 11:49
28F:→ Lordaeron: 什麽lambda, auto的,又不是没它们就不能写,不好写. 09/18 11:49
29F:推 Caesar08: 长知识罗 09/18 12:10
30F:推 lc85301: 我已经看不懂这是什麽东西了(yay 09/18 12:39
31F:推 steve1012: 没 auto 要多打字的确是很不好写啊 lol 09/18 12:45
32F:→ steve1012: move semantic 跟 shared pointer 也的确更好维护 09/18 12:46
33F:→ steve1012: 又不是叫每个人实作这些功能 只是拿来用还能嫌 lol 09/18 12:47
34F:→ steve1012: 爱用 c 可以用 c啊 09/18 12:47
35F:推 Bencrie: 更炫炮 09/18 13:14
36F:嘘 Sidney0503: 不爽不要用 每个语言都有自己的毛和边界问题 09/18 13:29
37F:→ Sidney0503: 不同语言适用范围也不一样 09/18 13:29
38F:→ Sidney0503: 你自己也说没auto一样可以写程式 没人拿枪逼你用auto 09/18 13:29
39F:→ Sidney0503: 事实上就是除了C++没有语言可以做到move semantic 09/18 13:30
40F:→ Sidney0503: Rvalue Reference就是只有C++11才有 这种效能上的掌 09/18 13:31
41F:→ Sidney0503: 控 是比其他语言强的 所以追求极致效能调教不会使用 09/18 13:31
42F:→ Sidney0503: C语言而是C++ 09/18 13:31
43F:→ Sidney0503: 你不需要这麽细微的效能处理 就不要用c++ 09/18 13:33
44F:→ Sidney0503: 所以没有C++11 可以用asm写出类似&&的想法 09/18 13:34
45F:→ Sidney0503: 提asm没有错啊 并不是鬼扯 09/18 13:34
46F:推 Sidney0503: C语言也有undefined behavior 不少还被C++规范 09/18 13:38
47F:→ Sidney0503: 来C++主场战C++ 你也是蛮幽默的 09/18 13:42
48F:→ Lordaeron: 不爽当然可以不用啊,但有人提到雷了,就当然得提啊。 09/18 14:23
49F:→ Lordaeron: 致於你扯的效能,我就等你一篇C++11 VS C的大作了,战吧 09/18 14:24
50F:推 Sidney0503: 地表上就是除了C++没有语言可以玩Rvalue-ref 09/18 14:32
51F:→ Sidney0503: 地表上就是没有语言可以做到比C++更细微的调教 09/18 14:34
52F:→ Sidney0503: 战不起来 09/18 14:34
53F:推 grayStone: c++ > c 09/18 15:02
54F:→ Lordaeron: 就等你的测试大作啊,战不战得起,不会是用嘴吧。 09/18 15:06
55F:→ Lordaeron: C++ VS C, PERORMANCE COMPARE!! 等待中。 09/18 15:08
56F:→ bibo9901: move semantics 是特色没错, 但要说是"优点"可能不适合 09/18 15:08
57F:→ bibo9901: 有 gc 或 jit 的语言几乎是不需要move semantics 09/18 15:09
58F:推 Sidney0503: 有GC就是慢 比如像java 但是java有一种情况可以有 09/18 15:14
59F:→ Sidney0503: 接近c/c++效能的状况 就是custom Collector 09/18 15:15
60F:→ bibo9901: 其实用 C 做分解动作也可以有move semantics同样的效果 09/18 15:20
61F:→ Sidney0503: 成立的原因也很简单 效能可以取决於释放空间的时机 09/18 15:20
62F:→ bibo9901: 但c++还多了一堆负担: rule-of-five, universal ref. 等 09/18 15:21
63F:推 Sidney0503: 那是因为不同状况下 move和copy成本不一样 09/18 15:28
64F:→ Sidney0503: 所以c++11提供了选择复制或搬移两种手段选择 09/18 15:28
65F:→ Sidney0503: 语言本来就是针对问题选需要的工具 09/18 15:28
66F:→ Sidney0503: 追求极致调教的3A游戏引擎核心几乎都是用C++刻的 09/18 15:29
67F:→ Sidney0503: 然後接口成python这类手稿语言方便快速开发 09/18 15:30
68F:→ Sidney0503: 当然快的代价就是不稳 C++本身又包山包海 自然是 09/18 15:32
69F:→ Sidney0503: 会有不少行为会让compiler错乱 现在C++的精神就是 09/18 15:33
70F:→ Sidney0503: 提供大量的选择 每个选择都会有优缺点 09/18 15:34
71F:推 Bencrie: 乱七八糟 09/18 15:34
72F:→ Sidney0503: 楼上这个说法我还真无法反驳 XDDDDD 09/18 15:34
73F:→ jimfan: 话说回来constexpr就是为了在编译时间预先找出陈述式的值 09/18 15:53
74F:→ jimfan: 用以减少runtime的运算,说到底还是为了让程式跑更快,代 09/18 15:54
75F:→ jimfan: 价系语言、编译器变复杂(我这不是废话吗) 09/18 15:56
76F:→ jimfan: 用心良苦 :-) 09/18 15:57
77F:→ Lordaeron: @Sidney0503,别再嘴了,只讲performance就好了。 09/18 17:27
78F:→ Lordaeron: 越来越多雷这件事,本来就是成立的。无可否认。 09/18 17:28
79F:推 holydc: 就已经认定新语法都是雷了,人家讲什麽当然看起来都像 09/18 20:29
80F:→ holydc: 鬼扯嘴炮罗 09/18 20:29
81F:推 yoco: ...C++ 又发疯了... 09/19 00:03
82F:→ Lordaeron: 旧语法就一堆雷了,要说新语法没雷,要怎麽讲? 09/19 11:50
83F:→ final01: 坐等yo 神开战XD 09/19 13:43
84F:推 holydc: 连旧语法都雷了哈哈哈 09/19 20:03
85F:推 steve1012: 到底是什麽雷啊 雷来雷去打高空 好像几万个雷一样 09/20 00:30
86F:→ bibo9901: most vexing parse 就可以雷到你跳起来 09/20 00:34
87F:推 steve1012: 这个"本来"是不是该有点根据啊 09/20 00:34
88F:推 CoNsTaR: 不是啊 自己不会写当然要怪语法雷啊 这样自尊心才舒服嘛 09/20 02:03
89F:推 bibo9901: 只有语法雷? exception 雷不雷? 多载消解雷不雷? 09/20 08:56
90F:→ bibo9901: 各种implicit conversion雷不雷? 09/20 08:57
91F:推 CoNsTaR: 期待楼上哪天设计出一个对任何面向都没有缺点的语言 09/20 09:49
92F:→ CoNsTaR: 到底是你该配合、学习怎麽驾驭一门语言和发挥它的优点 09/20 09:49
93F:→ CoNsTaR: 还是语言应该做到让你随便写都不会有问题? 09/20 09:49
94F:→ CoNsTaR: 充分了解如何对付一门语言的缺点、最大限度发挥它的优点 09/20 09:49
95F:→ CoNsTaR: 不就是「程式设计师」和别人不同的地方? 09/20 09:50
96F:→ CoNsTaR: 要不然就写写程式、没事嘴炮一下我妹也会啊 09/20 09:50
97F:推 steve1012: 的确是挺不雷的啊… 09/20 10:38
98F:推 Killercat: MVP我前阵子才被雷到一次 orz 09/20 10:54
99F:→ Killercat: 不过MVP比较偏向是因为相容性而无法补齐的洞 09/20 10:54
100F:→ Killercat: 不过现在已经有搭另外一座桥给你就是 09/20 10:54
101F:→ Killercat: 另外其实compile time都是小雷 runtime才是大雷.... 09/20 10:55
102F:推 shadow0326: 我记得在板上也看过几次被MVP雷到的问文 XD 09/20 11:33
103F:→ caras: 妹妹躺着也中枪 QQ 09/20 12:27
104F:推 CoNsTaR: 帮妹妹QQ XDD 09/21 06:23
105F:推 firejox: 只要能减少开发维护成本都很好:D 09/21 09:14
106F:推 Ommm5566: universal ref是负担? 直接可以搬rvalue的方法说慢 09/22 07:22
107F:→ Ommm5566: 我还真不知道哪个语言可以处理Lvalue比Rvalue快 09/22 07:23
108F:→ Ommm5566: 请bibo9901大大说一下 顺便说一下哪个有gc和jit的语言 09/22 07:23
109F:→ Ommm5566: 效能赢过c++ 09/22 07:23
110F:→ Ommm5566: 另外说C++雷的 麻烦说一下哪个语言不雷 09/22 07:25
111F:→ Ommm5566: 这边有很多会各种语言的可以和你讨论 09/22 07:25
112F:嘘 Ommm5566: 连特性都不懂还可以大放厥词 真的很好笑 09/22 07:35
113F:→ Lordaeron: 既然有雷不排,放新雷? 另外,没人说慢哦,是看有多快而已 09/22 21:10
114F:→ Lordaeron: 而且,从没有人说过任何面向都没缺点,只有说排雷而已. 09/22 21:11
115F:→ Lordaeron: 程式写久了,中文逻辑会变不好. 09/22 21:12
116F:→ Lordaeron: CPU本身就一堆雷了. 09/22 21:14
117F:→ Lordaeron: 用:不然不要用啊? 或是, 哪有没雷的语言, 这种人根本 09/22 21:17
118F:→ Lordaeron: 没理性讨论的空间. 09/22 21:18
119F:→ Lordaeron: 充分了解如何对付一门语言OOXX 的,叫compiler 09/22 21:20
120F:→ Lordaeron: 写程式是为了解决问题,而不是要发挥语言的OOXX. 09/22 21:21
121F:→ Lordaeron: 你发挥得多好都好,问题没解决,一样是一点价值都没有. 09/22 21:21
122F:推 steve1012: 感觉根本没讲清楚怎麽雷啊 随便丢个 mvp exception ove 09/22 23:09
123F:→ steve1012: rloading implicit conversion 就说这语言很雷 没写篇 09/22 23:09
124F:→ steve1012: 文章说服大家为啥算雷 为啥没办法避免 我是不太信服有 09/22 23:09
125F:→ steve1012: 多雷 09/22 23:09
126F:→ Lordaeron: 什麽事都有辨法避免啊,不然你以为COMPILER怎麽来? 09/23 09:33
127F:嘘 Ommm5566: 请问楼上compiler如何写可以不执行检查的情况下避免使 09/23 14:06
128F:→ Ommm5566: 用者把pointer指到非法区间? 09/23 14:06
129F:→ Ommm5566: 你说什麽事都有辨法避免啊 提出来啊 09/23 14:07
130F:推 Sirctal: 既然你那麽不爽 那就别用呀 何必让自己那麽不开心 09/23 16:57
131F:→ Sirctal: 对吧 09/23 16:57
132F:→ CoNsTaR: Lor 我也想知道什麽事都有办法避免的万能 compiler 要怎 09/24 00:08
133F:→ CoNsTaR: 麽避免自己什麽事都能避免 哈哈哈哈哈 09/24 00:08
134F:→ ronin728: \战起来/ \战起来/ 10/07 11:09







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:BuyTogether站内搜寻

TOP