这段《C++ Primer》的话如何理解?

2015-01-16 00:05:18 +08:00
 fetich

"The distinction between top-level and low level matters when we copy an object. When we copy an object, top-level consts are ignored.
Copying an object doesn't change the copied object. As a result, it is immaterial whether the object copied from or copied into is const."

主要是最后的 the object copied into is const 无法理解,比如A值复制给B,B如果是const类型,怎么进行赋值(原文说 immaterial,无关紧要?)

不知是不是我理解错了,因为我看勘误表也没有提到。(如果V友购买了中文版,能发一封2.4.3截图到fetich@outlook.jp,那是极好的了,感谢)

附上截图:
http://rghost.net/60366501/image.png

最后感谢大家解答。

2644 次点击
所在节点    问与答
13 条回复
tsui
2015-01-16 00:12:13 +08:00
it is immaterial whether (the object copied from) or (copied into) is const."



这书还有中文翻译版的么?
acros
2015-01-16 00:28:08 +08:00
这个const用法在英文术语里面是叫“top-level”"low-level"?

就是修饰对象的区别,一个const修饰指针(top-level),一个修饰指针指向的对象(low-level)。
如果是low-level,指针本身在复制时当然是const无关的。


这本是第五版吧,翻了下第四版没这个内容·····
acros
2015-01-16 00:36:51 +08:00
噗,说错了。
仔细看了下文章,最后一句的意思是:
复制时不会被赋值对象的值,有无const当然是没影响的····
fetich
2015-01-16 00:38:23 +08:00
@acros
的确是第五版的内容。比如 const int i 这个 const 也是top-level。
fetich
2015-01-16 00:39:38 +08:00
@tsui
加了括号还是不能理解。。。
acros
2015-01-16 00:42:07 +08:00
x,打字老打反,“复制”和“赋值”搅浑了···请无视上面。


1.书上最后一句意思: copy时不会改变被copy对象的值,有无const当然是没影响的····


2.针对你说的:

“主要是最后的 the object copied into is const 无法理解,比如A值复制给B,B如果是const类型,怎么进行赋值(原文说 immaterial,无关紧要?)”

一个const对象是初始化以后不再能被改变,初始化赋值是允许的(类内const变量也是,可以在初始化列表中指定)。 而且非const类型可以隐式转化成const类型,反过来就要用到C++的类型转换方法了,书后面也会讲····
fetich
2015-01-16 00:44:04 +08:00
@acros
被复制的对象 值不会改变,有无const没有关系,但被赋值的对象 如果是const类型,他的值初始化后不能被改变的啊。
fetich
2015-01-16 00:47:08 +08:00
@acros
啊啊,这么晚了,感谢回复,明天我仔细看看。;-)
acros
2015-01-16 00:49:46 +08:00
@fetich 对的。
const是给编译器检查用的,“=”符号含义就是拷贝一份对象出来,不会涉及到改变对象的值,检查被拷贝对象的const属性是多余的····
canautumn
2015-01-16 01:01:57 +08:00
其实这句话是这样解读的,Copying an object doesn't change the copied object. As a result, it is immaterial whether the object copied from or copied into is const.

这里边的object 指的是正在复制的对象,比如以下两个例子,调换2、3行的const都正确。
const int c2 = 42;
const int c3 = c2;
int c4 = c3;
这里边的object指的是c3. (指最后一行的复制)
const int ci = 42;
const int * const p1 = &ci;
const int * p2 = p1;
这里边的object指的是p1。(指最后一行的复制)
以上两个例子都是toplevel const 复制到toplevel non-const的例子,都正确,因为toplevel被忽略,可以从const复制到non-const,反过来当然也可以。

直接翻译这句话:“复制一个对象并不能改变被复制的对象的值,所以,被复制的对象和复制到的对象是不是const无关紧要。” 对应以上的例子1: 复制c3 不会改变c3的值,所以c3和c4 各自是不是const无所谓。对应例子2:复制p1不会改变p1的值,所以p1和p2 各自是不是(注意)”Toplevel“ const 无所谓。

这段话整个在讲的是toplevel const,这段儿还没讲到low-level的事儿,下段才是。

这句话确实有点晦涩。不过你要清楚指针在这本书里也叫做object就知道了。
acros
2015-01-16 01:39:01 +08:00
我发现我要被打脸了,怎么感觉说错了作者要表达的意思。

top level是C++11里面新出来的术语吧·····
看这篇的“顶级 const”:
http://www.ilanever.com/article/sitedetail.html?id=221#article-navi-7


看上面那篇C++11的解析吧,不要看我的了。
fetich
2015-01-16 20:22:57 +08:00
@canautumn
下午仔细看了几篇,可能我抓错终点了。作者强调的是赋值两者的一致性,感谢你的回复。
fetich
2015-01-16 20:23:32 +08:00
@acros
看起来像原文的翻译版。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/162556

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX