gpt4 book ai didi

c++ - 与成员函数中的 std::move(*this) 的行为差异

转载 作者:行者123 更新时间:2023-11-30 02:26:21 25 4
gpt4 key购买 nike

给定类定义:

struct MoveOnly
{
MoveOnly(int v_)
: v(v_)
{
std::cout << ((void*)this) << " MoveOnly " << v << "\n";
}

~MoveOnly()
{
std::cout << ((void*)this) << " ~MoveOnly " << v << "\n";
}

MoveOnly(const MoveOnly&) = delete;
MoveOnly& operator=(const MoveOnly&) = delete;

MoveOnly(MoveOnly &&src)
{
v = std::exchange(src.v, -1);
std::cout << ((void*)this) << " MoveOnly&& " << v << "\n";
}

MoveOnly& operator=(MoveOnly&&) = default;

MoveOnly&& Apply()
{
std::cout << ((void*)this) << " Apply " << v << "\n";
return std::move(*this);
}

int v;
};

控制台显示代码:

auto m1 = MoveOnly(1);
m1.Apply();

> 0x7fff5fbff798 MoveOnly 1
> 0x7fff5fbff798 Apply 1
> 0x7fff5fbff798 ~MoveOnly 1

现在,如果我更改 Apply 以返回一个值而不是右值引用:

MoveOnly Apply()
{
std::cout << ((void*)this) << " Apply " << v << "\n";
return std::move(*this);
}

我明白了:

auto m1 = MoveOnly(1);
m1.Apply();

> 0x7fff5fbff798 MoveOnly 1
> 0x7fff5fbff798 Apply 1
> 0x7fff5fbff790 MoveOnly&& 1
> 0x7fff5fbff790 ~MoveOnly 1
> 0x7fff5fbff798 ~MoveOnly -1

第一个示例似乎保留了原始对象,这违背了我对 std::move 的直觉。虽然因为它没有调用 move 构造函数,我可以看到原始对象如何仍然有一个 1

我在这里想弄清楚的是 C++ 标准如何解释这种行为,以及不同版本的 Apply() 的用例可能是什么。

最佳答案

std::move 不“做”任何事。它所做的只是将左值转换为右值。示例:

class Foo { ... };

void leave(Foo && f) {}

void take(Foo && f) { auto g = std::move(f); }

Foo f;

leave(f); // this won't compile, bar wants an rvalue

leave(std::move(f)); // this compiles, but f is not changed in any way

take(std::move(f)); // compiles, and leaves f in the moved from state

Apply 的原始版本本身不执行任何操作,但它可以启用其他功能。例如,假设 Apply 的原始定义:

auto m1 = MoveOnly(1);
m1.Apply(); // does nothing
auto m2 = m1; // doesn't compile
auto m2 = m1.Apply() // Does compile, and does something! moves m1 to m2

关于c++ - 与成员函数中的 std::move(*this) 的行为差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42893456/

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