首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >std::在C++中移动()和xvalue

std::在C++中移动()和xvalue
EN

Stack Overflow用户
提问于 2018-01-29 18:20:36
回答 2查看 1.1K关注 0票数 2

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

我查看了cp首选项页面,页面上写着"std::move()生成xvalue“。(好)

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

EN

回答 2

Stack Overflow用户

发布于 2018-01-29 18:43:44

std::move()将表达式从lvalue或rvalue转换为xvalue。

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

代码语言:javascript
复制
int main() {  
   int x = 3 + 4;  
   std::cout << x << std::endl;
}

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

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

请查看下面的示例:

代码语言:javascript
复制
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()检查下面的示例

代码语言:javascript
复制
swap(int &a, int &b) {
    int tmp = std::move(a); // tmp is an xvalue
    a = std::move(b);   
    b = std::move(tmp);
}

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

票数 3
EN

Stack Overflow用户

发布于 2018-01-29 18:27:59

那句话中没有循环定义。

以下表达式为xvalue表达式: 函数调用或重载操作符表达式,其返回类型为对对象的rvalue引用,如std::move(x); ..。

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

代码语言:javascript
复制
template< class T >
constexpr typename std::remove_reference<T>::type&& move( T&& t ) noexcept;

其返回值必须是rvalue引用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48507641

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档