C++ 11 move(x)实际上是指static_cast <X &&>(x)?

use*_*112 11 c++ move move-semantics c++11

刚读完Stroustrup的C++编程语言第4版,他在第7章中说:

move(x)表示static_cast<X&&>(x)X是x的类型

由于move(x)不移动x(它只是产生对x的rvalue引用),如果move()被称为rval()则会更好

我的问题是,如果move()只是将变量转换为rval,那么实现对变量的引用"移动"的实际机制是什么(通过更新指针)?

我认为move()就像一个移动构造函数,除了客户端可以使用move()来强制编译器?

Mik*_*our 6

什么是实现对变量的引用"移动"的实际机制(通过更新指针)?

将其传递给采用右值引用的函数(或构造函数),并从该引用移动值.如果没有强制转换,变量就无法绑定到右值引用,因此无法传递给这样的函数 - 这可以防止变量意外移动.

我认为move()就像一个移动构造函数,除了客户端可以move()用来强制编译器??

没有; 它用于将左值转换为右值,以便将其传递给需要右值引用的移动构造函数(或其他移动函数).

typedef std::unique_ptr<int> noncopyable;  // Example of a noncopyable type
noncopyable x;
noncopyable y(x); // Error: no copy constructor, and can't implicitly move from x
noncopyable z(std::move(x)); // OK: convert to rvalue, then use move constructor
Run Code Online (Sandbox Code Playgroud)


awe*_*oon 5

当您打电话时move,您只是在告诉“嘿,我想移动这个对象”。并且当构造函数接受rvalue-reference时,它将其理解为“嗯,有人要我将数据从该对象移入我自己。所以,好的,我来做”

std::move不会移动或更改对象,它只是将其“标记”“可移动”。并且只有接受右值引用的函数才能实现移动实际对象。

这是一个示例,描述了上面的文本:

#include <iostream>
#include <utility>

class Foo
{
public:
    Foo(std::size_t n): _array(new int[n])
    {

    }

    Foo(Foo&& foo): _array(foo._array)
    {
        // Hmm, someone tells, that this object is no longer needed
        // I will move it into myself
        foo._array = nullptr;
    }

    ~Foo()
    {
        delete[] _array;
    }

private:
    int* _array;
};

int main()
{
    Foo f1(5);

    // Hey, constructor, I want you move this object, please
    Foo f2(std::move(f1));

    return 0;
}
Run Code Online (Sandbox Code Playgroud)