gpt4 book ai didi

c++ - 为什么在这里未调用move构造函数?

转载 作者:行者123 更新时间:2023-12-02 10:15:40 26 4
gpt4 key购买 nike

我正在尝试在下面的代码中调用move构造函数,其中会添加两个列表。鉴于我在Stroustrup书中所读的内容,应在operator+(const X& a, const X& b)返回时调用move构造函数,但是不会根据下面的输出进行调用。仅移动分配被调用。

有谁知道为什么在从函数返回时未调用move构造函数?

谢谢

#include <iostream>
#include <list>
using std::list;
using std::cout;
using std::initializer_list;

class X {
list<int> *p;
size_t sz;
public:
X() : p{ new list<int>(0) } { }
X(size_t size) : p{ new list<int>(size) }, sz {size} { }
X(initializer_list<int> li) : p{ new list<int>(li) }, sz { li.size() } { }

X(const X&);
X& operator=(const X&);

// move
X(X&&);
X& operator=(X&&);

size_t size() const { return sz; }
int &operator[](int);
int &operator[](int) const;

class size_mismatch { };
};

X::X(const X& a)
{
p = new list<int>();
for (auto pp : *(a.p))
p->push_back(pp);
sz = a.sz;
}

X& X::operator=(const X& a)
{
delete p;
p = new list<int>();
for (auto pp : *(a.p))
p->push_back(pp);
sz = a.sz;
return *this;
}

X::X(X&& a) : p{ a.p }, sz{ a.sz }
{
cout << "here0\n";
a.p = nullptr;
a.sz = 0;
}


X& X::operator=(X&& a)
{
cout << "here1\n";
p = a.p;
sz = a.sz;
a.p = nullptr;
a.sz = 0;
return *this;
}

int& X::operator[](int x)
{
for (auto &i : *p) {
if (x == 0) return i;
--x;
}

throw std::out_of_range("List container");
}

int& X::operator[](int x) const
{
for (auto &i : *p) {
if (x == 0) return i;
--x;
}

throw std::out_of_range("List container");
}

X operator+(const X& a, const X& b)
{
if (a.size()!=b.size())
throw X::size_mismatch{};

X res(a.size());

for (int i = 0; i != a.size(); ++i)
res[i] = a[i] + b[i];

return res;
}

int main(int argc, char *argv[])
{
X px = {0, 1, 2};

for (int i=0; i < px.size(); i++)
cout << px[i];
cout << '\n';

X py(px);
for (int i=0; i < py.size(); i++)
py[i]++;
for (int i=0; i < py.size(); i++)
cout << py[i];
cout << '\n';

X pz;
pz = py;
for (int i=0; i < pz.size(); i++)
cout << pz[i];
cout << '\n';

X ph;
// This should call move constructor
ph = px + py + pz;
for (int i=0; i < ph.size(); i++)
cout << ph[i];
cout << '\n';

return 0;
}

$ g++ -std=c++11 test62.cc && ./a.out
012
123
123
here1
258

最佳答案

在此片段中:

X ph;
// This should call move constructor
ph = px + py + pz;
ph已经创建,因此没有调用move构造函数的问题。

如果您将代码段更改为:
X ph = px + py + pz;

由于复制删除,您仍然不会调用move构造函数。

如果您在 std::move的return语句中显式 operator+结果,则可以看到move构造函数正在被调用:
X operator+(const X& a, const X& b)
{
// ...
return std::move(res);
}

这是 demo

关于c++ - 为什么在这里未调用move构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62011511/

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