成员函数与 std::move(*this) 的行为差异
Behavioral differences with std::move(*this) from a member function
给定类定义:
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
以返回值而不是 r 值引用:
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 的直觉背道而驰。 虽然由于它不调用移动构造函数,但我可以看到原始对象仍然具有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
相关文章:
- 为什么使用 "this" 指针调用派生成员函数?
- 我可以将调用类的"this"传递给 lambda 函数吗?
- 创建具有 new in 函数和"this is nullptr"异常的对象
- C++调用具有 *this 属性的单个帮助程序函数
- Doees the 'this' 指针参与虚函数的多态行为
- 析构函数中的"delete this"
- 为什么成员函数内的"this"指针为空?
- 为什么我需要在转换构造函数上引用 this->?
- 通过从构造函数中的'this'复制的指针改变常量对象
- 类中的数组变量C++导致"was not declared in this scope"实现文件的一个函数中错误,但在构造函数中不会导致错误
- 在 C++ 中返回新的构造函数(*this)工厂
- C++ 中的构造函数、继承、堆栈、堆、this-pointer 和段错误
- 成员函数的"this"参数具有"const"类型,但我的函数实际上不是"const"
- 使用 std::function 作为成员函数,它捕获"this",并在析构函数之后从复制的 lam
- 为什么使用指向函数的指针调用虚函数时不需要指针"this"?
- 从自身内部替换 std::函数(通过将移动赋值到 *this?)
- 使用 boost::序列化代码将 *this 传递给模板函数会产生错误
- c++:成员函数中的"this == nullptr"安全吗?
- 带有 "this" 关键字的 Java Copy 构造函数
- 返回C++"This"对象的函数