【问题标题】:std::move() and xvalue in C++ [duplicate]C ++中的std :: move()和xvalue [重复]
【发布时间】:2018-07-08 12:36:17
【问题描述】:

有人能给我 xvalue 和 std::move() 行为的“非循环”定义/解释吗?

我查看了 cppreference 页面,它说“std::move() 产生一个 xvalue”。 (好的)

然后我寻找“xvalue”的定义,它说的第一件事是它是一个函数调用或重载的运算符表达式,例如“std:move”。 (???)

【问题讨论】:

标签: c++ xvalue stdmove


【解决方案1】:

std::move() 将表达式从 lvaluervalue 转换为 xvalue

lvalue 是一个对象占用内存中的某个位置,而 rvalue 是临时占用内存。

int main() {  
   int x = 3 + 4;  
   std::cout << x << std::endl;
}

在上面的示例中,x 是一个左值3 + 4 是一个右值。现在看到x 不是临时的,而3 + 4 表达式是临时值。

现在考虑你这样做:int y = x;。你的内存中有两个 x 的副本,对吧?

查看以下示例:

swap(int &a, int &b) {
    int tmp = a;   // Two copies of a; one of them is tmp
    a = b;      // Two copies of b; one of them is a
    b = tmp;    // Two copies of tmp; one of them is b
}

使用std::move()检查以下示例:

swap(int &a, int &b) {
    int tmp = std::move(a); // tmp is an xvalue
    a = std::move(b);   
    b = std::move(tmp);
}

你不抄袭;你把它们移到某个地方。实际上,您将其内容传输了一段时间。他们很快就会被摧毁。他们现在是xvalues :)

【讨论】:

  • 在第二个版本的 swap 中,tmp 是一个左值。这三个语句中的每一个的 rhs 都是 std::move 从左值生成的 xvalue。
【解决方案2】:

that sentence 中没有循环定义。

以下表达式是 xvalue 表达式:

函数调用或重载的运算符表达式,其返回类型是对对象的右值引用,例如std::move(x);

...

这里std::move只是一个例子,本质是“其返回类型是右值引用”。由于返回右值引用的函数并不常见,而 std::move 旨在这样做,因此它是一个很好的例子。这是std::move的签名:

template< class T >
constexpr typename std::remove_reference<T>::type&& move( T&& t ) noexcept;

其返回值必须是右值引用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-12
    • 2017-05-28
    • 1970-01-01
    • 2018-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多