![]() |
1
39
您的代码导致未定义的行为。
现在,“在对象的生存期结束之后,在重用或释放所占用的存储之前,在原始对象所占用的存储位置创建一个新对象”正是您所要做的。 你的对象是类类型的,它 做 包含类型为const限定的非静态数据成员。因此,在运行赋值运算符之后,引用旧对象的指针、引用和名称是 不 作为可能出错的具体例子,请考虑:
期望这个输出?
错了!您可能会得到该输出,但const成员是3.8/7中所述规则的异常的原因是编译器可以处理
因为(非正式地)
const对象不会更改其值
. 在优化包含const对象的代码时,这种保证的潜在价值应该是显而易见的。因为有任何方法可以修改
实际上我对使用
|
![]() |
2
23
第一:当您创建数据成员时
至于你对这个问题的“解决方案”:
然而,撇开技术问题不谈,我承认你可能在几乎所有的平台上都能找到你的“解决方案” 只要代码和示例中一样简单 . 不过,这并不能说明 好的 解决方案。事实上,我认为这甚至不是 可接受的 解决方案,因为输入法代码从来没有这么简单。多年来,它将得到扩展、改变、变异和扭曲,然后它将悄无声息地失败,需要36小时令人麻木的调试轮班才能找到问题。我不知道你的情况,但每当我发现像这样的代码负责36小时的调试乐趣,我想扼杀这个可怜的傻瓜谁这样对我。 GotW #23 ,对这个想法进行了一个又一个的剖析,最后得出结论 充满陷阱 经常出错 ,而且 使派生类的作者生活在地狱里 ... |
![]() |
3
9
如果A有一个const成员,你怎么可能分配给它?你在试图完成一些根本不可能的事情。您的解决方案与原始方案相比没有新的行为,这不一定是UB,但您的解决方案肯定是UB。
为了更清晰起见,请编辑: Const cast并不总是引入未定义的行为。不过,你肯定是这么做的。除此之外,在放入之前不调用所有析构函数(甚至没有调用正确的析构函数)是未定义的,除非您确定t是POD类。此外,还有一些未定义的行为与各种形式的遗传有关。 不尝试分配给常量对象。 |
![]() |
4
1
如果您确实希望有一个不可变(但可分配)的成员,那么没有UB,您可以这样安排:
|
![]() |
5
0
阅读此链接: http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=368 特别地。。。
|
![]() |
6
0
阿飞,这里没有未定义的行为,因为
你有 ,其中第一个已经指出。
编辑
:如果你班上有这个
|
![]() |
Xirema · 如何正确编写运算符的R值重载 7 年前 |
![]() |
Mário Feroldi · 在运行时调用代码中未调用的函数 7 年前 |
![]() |
chqrlie · 所有位0都可以是整数的陷阱表示吗? 7 年前 |
![]() |
Vincent · 打印零,但不基于该条件退出循环 7 年前 |
![]() |
Dror K. · 用%p打印空指针是未定义的行为? 7 年前 |
![]() |
Bite Bytes · C中允许这种函数调用吗 7 年前 |
![]() |
K J Gor · C中strncpy的内存混淆 8 年前 |