2

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

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

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

4

2 回答 2

2

std::move()将表达式从左值右值转换为xvalue

左值是一个对象占用内存中的某个位置,而右值是临时占用内存。

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

在上面的示例中, thex是一个左值,而 the3 + 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);
}

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

于 2018-01-29T18:43:44.697 回答
1

那句话中没有循环定义。

以下表达式是 xvalue 表达式:

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

...

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

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

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

于 2018-01-29T18:27:59.763 回答