|
|
1
3
这是你的代码,
modernized to use C++23
特征。
首先,你应该熟悉
rule of 3/5/0
(
默认情况下,当没有手动定义任何内容时,编译器会自动为构造函数和赋值运算符生成默认实现。以下是一个简洁的表格,简要介绍了其工作原理:
在原始代码中,使用了隐式生成的复制构造函数。具体来说,你的代码无意中生成了一个额外的实例
这发生在以下行中:
这是一个极端情况。请注意
在这种情况下,由于您使用的是三元运算符和
编译器必须协调这两种可能性,以使
As
|
|
|
2
2
这一切都归结为三元运算符产生的类型。检查类型特征。
这个
这可能违反直觉,但请注意
由于重复,这可能是次优的(就DRY等规则而言)
使用if-else语句(以及插入指令的复制构造函数)进行演示: https://godbolt.org/z/MGbG61x59
另一种选择可能是
演示与
|
|
3
-4
这是由于C++如何管理对象和引用的生存期,特别是在循环中自动存储持续时间的情况下。
核心问题不是编译器混淆或不知道它是全局的。问题在于
为什么是双重毁灭?
如果你打算让引用潜在地指向一个全局对象,并希望避免额外的破坏,你需要以不同的方式管理生命周期。 方法很少 : 在循环外声明引用 :
使用指针:
循环外的条件逻辑:
|
|
AstralHex · 矩阵乘法代码工作不正常 9 月前 |
|
|
Fishie · 作为类成员的智能指针是否仍然自动释放?[关闭] 9 月前 |
|
|
Die4Toast · 递归调用成员箭头运算符-> 9 月前 |
|
|
Anka Hanım · 关于结构和动态数组地址的问题 10 月前 |