gpt4 book ai didi

c++ - 当左值分配给右值引用时会发生什么?没有破坏临时对象?

转载 作者:行者123 更新时间:2023-11-30 01:37:16 29 4
gpt4 key购买 nike

#include <iostream>
using namespace std;
#include <cstring>

class Word{
private:
char* ptr = nullptr;
public:
Word(){
cout << "default constructor" << endl;
}
Word(const char* sentence):ptr{new char [strlen(sentence)+1]}{
strcpy(ptr, sentence);
cout << "conversion constructor: " << ptr << endl;
}
Word(const Word& w):ptr{new char [strlen(w.ptr)+1]}{
strcpy(ptr, w.ptr);
cout << "copy constructor: "<< ptr << endl;
}
~Word(){
cout << "destructor: " << ptr << endl;
}
};

int main(){
Word a ("A stands for apple!");
Word&& b = "B stands for Banana, rvalue ref";
b = a;
}

我的 Eclipse 结果:

conversion constructor: A stands for apple!
conversion constructor: B stands for Banana, rvalue ref
destructor: A stands for apple!
destructor: A stands for apple!

我的期望:

conversion constructor: A stands for apple!
conversion constructor: B stands for Banana, rvalue ref
destructor: B stands for Banana, rvalue ref
destructor: A stands for apple!
destructor: A stands for apple!

我对这一步感到困惑。

b = a;

当 a 被赋值给 b 时,它可能假设首先销毁 b 持有的临时对象(cstring 为“B stands for Banana, rvalue ref”),然后将 a 的值赋给 b。为什么在Eclipse的结果中,没有对临时对象进行销毁?

最佳答案

你的期望是错误的。破坏不会比 build 更多。

When a is assigned to b, it could suppose to first destruct the temporary object

没有。 b 指的是临时对象。分配给对象不会导致对象被销毁。

发生的情况是:Word 的隐式生成的赋值运算符将赋值所有成员。因此,在赋值之后,b.ptr 的先前值被泄露并且与 a.ptr 具有相同的值(指向相同的字符串)。

关于c++ - 当左值分配给右值引用时会发生什么?没有破坏临时对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49982522/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com