C_and_CPP 板


LINE

※ 引述《photon3108 (John)》之铭言: : 遇到的问题: (题意请描述清楚) : int ** ipp; : int const ** icpp = ipp; // Error : int const * const * icpcp = ipp; // OK : 程式跑出来的错误结果: : invalid conversion : 开发平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux) : vc++ 2008, gcc 4.4 : 为什麽 line 2 无法编译,line 3 又可以呢?,谢谢。 简单的答案是... C++ 的自动 non-const -> const 规则不会递回发生。 以来源 type 的 * 中间没有出现 const 的最简单状况来说, 它并不会飞越第一层非手动加 const 的 * 号 (由右往左看), 过了最後一层 const * 就必须是 exactly match 才可以通过编译。 int * * * * * ippppp; int * * * const * const * ipppcpcp = ippppp; // 可以 int * const * * const * const * ipcppcpcp = ippppp; // 不行 int const * * * const * const * icpppcpcp = ippppp; // 不行 int * * const * const * const * ippcpcpcp = ippppp; // 可以 int const * * const * const * const * icppcpcpcp = ippppp; // 不行 这颜色只是标示开始看的起点, 只要有上色的部分都必须跟 RHS type 相对位置的部分是 exactly match。 当然在更复杂的状况下上面讲的也只是必要条件, 还不是充分条件。 不想知道为什麽的就背下这规则就好, 下面可以跳过。 当然它这麽规定必然有原因, 前篇推文里 softwind 也有讲到了, 这边再讲清楚一点。 这问题其实是一个 FAQ: http://www.parashift.com/c++-faq-lite/const-correctness.html#faq-18.17 还是看到脑子打结的话也没关系, 重点在於你需要让更多 type 来参与你的实验: const int i = 0; int *ip; int const **icpp = &ip; // 想通过编译必须用 const_cast<int const **>(&ip) 假设上面三行可以通过编译, 考虑永远合法且可编译的下面这行: *icpp = &i; // 意思就是 ip = &i; 如果今天 compiler 让你的 int const **icpp = &ip; 通过编译, 那麽这就代表它默许了 *icpp = &i; 这种免 const_cast 就能把 const 消去的写法。 我也知道很多人书看得多, 然後 code 看得多也写得多以後, 会产生一种某个 type 包含的 const 由少变多必然安全且合法的错觉, 但是其实并没有任何一本书讲过把 const 数量变多就是对的。 int ** 变成 int const ** 确实表面上看起来 const 变多了应该要会过, 但是让它过的话却隐喻了 int const * 可以直接 assign 给 int * 这件事。 意思是如果让这个不用 const_cast 就合法: (int const **) = (int **); 就代表这个不用 const_cast 也能合法: (int *) = (const int *) 其实一开始我也只想回上面这四行, 但是根据以往经验只回那四行反而会被当成听不懂问题的番仔, 所以只好开一篇来讲。 -- Ling-hua Tseng ([email protected]) Department of Computer Science, National Tsing-Hua University Interesting: C++, Compiler, PL/PD, OS, VM, Large-scale software design Researching: Software pipelining for VLIW architectures Homepage: http://www.tinlans.org --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 118.160.112.117
1F:推 bobhsiao:竟然会有人把你当番仔...?? 05/26 05:29
※ 编辑: tinlans 来自: 118.160.108.141 (05/26 05:39)
2F:→ tinlans:因为不是每个人都看得出关联性,会认为他问东我答西。 05/26 05:42
3F:→ wudidog:这种用法,这种聪明人,公司会第一个先FIRE吧@@ 05/26 07:32
4F:推 ilovebbs:好复杂<0>..记起来就好XD 05/26 08:55
5F:推 loveme00835:推推~ 05/26 09:44
6F:推 nowar100:Good! 05/26 10:00
7F:推 james732:感谢分享?我对这种东西真的很没辄 XDDD 05/26 10:09
8F:→ james732:    ↑我想打的是! 弄错了 orz 05/26 10:10
9F:推 loveme00835:两个符号位置差很远说!> < 05/26 10:17
10F:推 VictorTom:又有神出现了, 快拜....<(_ _)> 05/26 10:18
11F:推 linjack:获益良多! 05/26 11:12
12F:推 softwind:最後一段看好久才懂... 05/27 00:04
13F:推 tomap41017:真的是神等级的= =+ 05/29 18:45
14F:推 sdimkk:神 09/19 16:40
15F:推 iamstudent:推荐这篇文章 11/09 01:20







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灯, 水草

请输入看板名称,例如:Boy-Girl站内搜寻

TOP