钱包下载网址imToken|move

作者: 钱包下载网址imToken
2024-03-08 20:51:40

C++:move,带你从根本理解move函数是什么_c++ move-CSDN博客

>

C++:move,带你从根本理解move函数是什么_c++ move-CSDN博客

C++:move,带你从根本理解move函数是什么

KNGG

已于 2022-04-25 17:07:21 修改

阅读量1.4w

收藏

94

点赞数

31

分类专栏:

C++

文章标签:

c++

c语言

windows

visual studio

经验分享

于 2022-04-20 08:44:52 首次发布

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/qq_51568363/article/details/124285294

版权

C++

专栏收录该内容

5 篇文章

8 订阅

订阅专栏

一: move

这个C++专栏都到第三篇博客了,希望大家看完有用的话可以康康博主往期的博客,有兴趣的话可以关注一下,嘻嘻,不说了,说到move离不开的就是,移动语义和值类型,那我们就从值类型先入手吧!

1.值类型(value category)

        此图片取自https://zh.cppreference.com/w/cpp/language/value_category网站,这里介绍了C++的所用值类型,但常用的只有后两个,左值,右值,那左值,右值是什么呢?很多博客视频都有介绍很多很多,听得头都大了,那还是用我们自己的话说吧!

        左值:可以出现在 operator= 左侧的值;

        右值:可以出现在 operator= 右侧的值;

        当然这并不是全部正确的,但百分之90多都是这种情况,但有例外:

        std::string();类似这种一个类加括号也就是临时变量都是右值;

        函数的形参永远是左值;

        好了记住红色部分就能分清楚C++值类型了,这个就是基础了,是不是很简单呢,cool,那么下来我们就看看什么是移动语义了。

2.移动语义

        移动究竟是干什么呢?我们还是不看那令人头痛的官方解释了,真的会令人栓Q,我还是用我自己理解的话说吧,方便理解和记忆,他就是这么一个情况:

        假如我们有两个指针 一个指针A,一个指针B,指针A指向了一个很复杂的内容,此时我们需要指针B指向这个很复杂的内容,之后我们就不需要指针A了,它可以滚蛋了,可以析构掉了,这个就是移动语义,结果就是将原来指针A指向的内存交给了指针B,指针A不指向任何内存。相当于B偷走了A的东西。

        相对的有移动语义就有复制语义,复制语义就是B指针要想获得同样的内容就会发生拷贝,大部分都是深拷贝(浅拷贝,深拷贝有机会我会补上一篇博客的),结果就是指针A指向一片内存,指针B指向了另一片内存,但两片内存中存储的内容是相同的,大大的浪费性能。 

        那我们如何实现我们想要的效果呢?就是move语句了

3.std::move

        终于到move了,有了上面几个基础就可以开始理解move是什么了,首先记住一句话:

        std::move 并不会进行任何移动

        好家伙,什么啊,一下整蒙了move不进行移动,别急我们先看一下例子

#include

class Vector

{

private:

int x, y, z;

public:

Vector(int x, int y, int z) :x(x), y(y), z(z) {}

};

int main()

{

std::vector vec;

vec.push_back(Vector(1,2,3));//2

Vector a(4,5,6);

vec.push_back(a);//1

vec.push_back(std::move(a));//2

}

        我们来看一下这段代码,第一个push_back里是一个临时变量还记得吗?临时变量都是右值,第二个push_back,因为a是个左值所以传入的参数是个左值,第三个push_back我们使用了move方法本质上我们希望他变成一个右值进而发生移动语义,就是一个偷的过程,而不是复制的过程,让我们进到源码里看看是什么情况.要记住move 它不进行任何移动.还要知道一件事:

        在运行期move是无作为的.

_CONSTEXPR20_CONTAINER void push_back(const _Ty& _Val) { // insert element at end, provide strong guarantee

emplace_back(_Val);

}

_CONSTEXPR20_CONTAINER void push_back(_Ty&& _Val) {

// insert by moving into element at end, provide strong guarantee

emplace_back(_STD move(_Val));

}

        我们看到了一个push_back的重载我们通过调试可以得知,第一个push_back调用的是源码的第二个,第二个push_back调用的是源码的第一个,第三个调用的是第二个(偷懒一下),要注意的是

(_Ty&& _Val)它并不是一个万能引用,因为vector是一个类模板,(之后我会出博客讲到万能引用和引用叠加等等...)这里的TY就是type的意思就是参数的类型,会进行模板推导.第一个push_back的参数是一个左值引用的形式,第二个是右值引用的形式,第二个会触发一个移动语义,将原先的a的内存偷了过来。

        为了加深理解,我们看一下move的源码并且拿过来将代码变为下面这样,变成我们自己的move看看是否能运行成功。

#include

#include

// FUNCTION TEMPLATE move

template

constexpr std::remove_reference_t<_Ty>&& move(_Ty&& _Arg) noexcept { // forward _Arg as movable

return static_cast&&>(_Arg);

}

class Vector

{

private:

int x, y, z;

public:

Vector(int x, int y, int z) :x(x), y(y), z(z) {}

};

int main()

{

std::vector vec;

vec.push_back(Vector(1,2,3));

Vector a(4,5,6);

vec.push_back(a);

vec.push_back(move(a));

}

        我们可以看到我们将move搬过来实现一样可以运行成功,我们来看源码,_t是C++14之后将原来的type的形式全部都变成type reference的形式,remove_reference_t就是将这个函数木板的类别<_Ty>它的加引用的情况都给去掉了,无论是左值引用(&)还是右值引用(&&)都会移除掉,之后再用static_cast强转为右值引用的形式,那么我们能看出move就是将参数原来的修饰符全部都删掉,在强转为右值引用输出,就是这么简单,move没有干任何移动的过程,所以还是那句话:

        std::move 并不会进行任何移动

          真正的移动是要自己写的,发生在之后也就是这里

public:

template

_CONSTEXPR20_CONTAINER decltype(auto) emplace_back(_Valty&&... _Val) {

// insert by perfectly forwarding into element at end, provide strong guarantee

auto& _My_data = _Mypair._Myval2;

pointer& _Mylast = _My_data._Mylast;

if (_Mylast != _My_data._Myend) {

return _Emplace_back_with_unused_capacity(_STD forward<_Valty>(_Val)...);

}

_Ty& _Result = *_Emplace_reallocate(_Mylast, _STD forward<_Valty>(_Val)...);

#if _HAS_CXX17

return _Result;

#else // ^^^ _HAS_CXX17 ^^^ // vvv !_HAS_CXX17 vvv

(void) _Result;

#endif // _HAS_CXX17

}

然而move的作用也就是强行转换成右值引用。

二.总结

        move的大概就介绍完了,在最后我们提到了值引用的概念,还能看到一个新的函数 forward,我下一篇博客就会重点来讲这两个是什么,如果这篇博客能帮助到你的话,请关注下博主,博主会缓慢更新一下奇奇怪怪的知识,ok,本篇博客任何有问题,和错误的地方都欢迎大家来指正,也谢谢大家看到这里,下一篇博客见!!

优惠劵

KNGG

关注

关注

31

点赞

94

收藏

觉得还不错?

一键收藏

打赏

知道了

9

评论

C++:move,带你从根本理解move函数是什么

一: std::move 这个C++专栏都到第三篇博客了,希望大家看完有用的话可以康康博主往期的博客,有兴趣的话可以关注一下,嘻嘻,不说了,说到move离不开的就是,移动语义和值类型,那我们就从值类型先入手吧!1.值类型(value category)...

复制链接

扫一扫

专栏目录

基于C++,在主函数中输入10个整数到数组中,调用函数move()完成将数组元素循环移动k位,适合新手

05-26

在主函数中输入10个整数到数组中,调用函数move()完成将数组元素循环移动k位(要求函数参数为:1数组名;2数组元素个数;3循环移动的位数k)。当k>0时,实现循环右移;当k<0时,实现循环左移。循环右移一位的意义是:将数组全体元素向右移动一个元素的位置,原数组最后一个元素移动到数组最前面,即第0个元素位置。提示:当k<0时,可转换成等价的循环右移。调用函数print()输出移动前和移动后的全体数组元素。

C++中的移动构造函数及move语句示例详解

01-20

前言

本文主要给大家介绍了关于C++中移动构造函数及move语句的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。

首先看一个小例子:

#include

#include

#include

#include

using namespace std;

int main()

{

string st = I love xing;

vector vc ;

vc.push_back(move(st));

cout<

if(!st.empty(

9 条评论

您还未登录,请先

登录

后发表或查看评论

C++11中std::move、std::forward、左右值引用、移动构造函数的测试问题

09-08

主要介绍了C++11中std::move、std::forward、左右值引用、移动构造函数的测试,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

[c++]push_back的tip

最新发布

o0cot0o的博客

12-20

320

所以,如果你的结构体或类删除了拷贝构造函数,就需要给 push_back 传入一个右值。当然,你也可以直接使用 emplace_back,也不会有这样的问题了。因为 std::thread 的实现中是删除了拷贝构造函数的,所有在调用 push_back 时需要传入一个右值,传入左值就会提示你拷贝构造已经被删除。但是,在查看 vector 的代码时,发现 push_back 有两个重载函数,传入常量左值引用也不会导致拷贝发生,那么这个拷贝构造是发生在什么地方呢?

C++ Lambda Story

02-18

This book shows the story of lambda expressions in C++. You’ll learn how to use this

powerful feature in a step-by-step manner, slowly digesting the new capabilities and

enhancements that come with each revision of the C++ Standard.

We’ll start with C++98/03, and then we’ll move on to the latest C++ Standards.

• C++98/03 - how to code without lambda support. What was the motivation for the new

modern C++ feature?

• C++11 - early days. You’ll learn about all the elements of a lambda expression an

深入理解C++中的move和forward!

C语言与CPP编程的博客

08-10

2233

导语|在C++11标准之前,C++中默认的传值类型均为Copy语义,即:不论是指针类型还是值类型,都将会在进行函数调用时被完整的复制一份!对于非指针而言,开销极其巨大!因此在C++11以后,引入了右值和Move语义,极大地提高了效率。本文介绍了在此场景下两个常用的标准库函数:move和forward。一、特性背景(一)Copy语义简述C++中默认为Copy语义,因此...

C++ move使用

昔拉的博客

01-09

8143

move作用主要可以将一个左值引用转换成右值引用,从而可以调用C++11右值引用的拷贝构造函数,在对象拷贝的时候,在运行时,它们不会产生一行代码原先的对象也会清空, 可以减少资源创建和释放。

...

一文带你详细介绍c++中的std::move函数

热门推荐

zhangmiaoping23的专栏

07-29

1万+

将vectorB赋值给另一个vectorA,如果是拷贝赋值,那么显然要对B中的每一个元素执行一个copy操作到A,如果是移动赋值的话,只需要将指向B的指针拷贝到A中即可,试想一下如果vector中有相当多的元素,那是不是用move来代替copy就显得十分高效了呢?上述例子中,由于在之前已经对变量val进行了定义,故在栈上会给val分配内存地址,运算符=要求等号左边是可修改的左值,4是临时参与运算的值,一般在寄存器上暂存,运算结束后在寄存器上移除该值,故①是对的,②是错的。.........

C++ move()函数

nihao_2014的博客

01-08

7126

目录

1. 左值和右值的概念

2. 引用

3. 左值引用和右值引用

3.1 左值引用

3.2 右值引用

1. 左值和右值的概念

要了解move函数首先弄清左值引用和右值引用。左值、左值引用、右值、右值引用

左值是可以放在赋值号左边可以被赋值的值;左值必须要在内存中有实体;

右值当在赋值号右边取出值赋给其他变量的值;右值可以在内存也可以在CPU寄存器。

一个对象被用作右值时,使用的是它的内容(值),被当作...

std::move & 左值右值 &左值引用右值引用

s11show_163的博客

03-02

1754

一句话概括std::move ———— std::move是将对象的状态或者所有权从一个对象转移到另一个对象,只是转移,没有内存的搬迁或者内存拷贝。

好了,下面系统的讲

右值引用(及其支持的Move语意和完美转发)是C++0x加入的最重大语言特性之一。从实践角度讲,它能够完美解决C++中长久以来为人所诟病的****临时对象效率问题。从语言本身讲,它健全了C++中的引用类型在左值右值方面的缺陷。从库设计者的角度讲,它给库设计者又带来了一把利器。从库使用者的角度讲,不动一兵一卒便可以获得“免费的”效率提升。

C++中move的使用

qq_41902325的博客

06-25

1万+

1.引言

在学习move使用的时候首先要分清C++中的左值和右值。

因为关于左值和右值区分比较复杂,我们可以采取一个简化的观点,这将在很大程度上满足我们的目的。

左值

最简单的做法是将左值(也称为定位器值)看作函数或对象(或计算为函数或对象的表达式)。所有的左值都分配了内存地址。最初定义左值时,它们被定义为“适合于赋值表达式左侧的值”。但是,后来在语言中添加了const关键字,左值被分为两个子类:可修改的左值(可以更改)和不可修改的左值(const)。

右值

最简单的做法是把右值想象成“所有不是左值的东西”

c++11 std::move() 的使用

01-07

std::move函数可以以非常简单的方式将左值引用转换为右值引用。(左值、左值引用、右值、右值引用 参见:http://www.cnblogs.com/SZxiaochun/p/8017475.html)

通过std::move,可以避免不必要的拷贝操作。

std::move是为性能而生。

std::move是将对象的状态或者所有权从一个对象转移到另一个对象,只是转移,没有内存的搬迁或者内存拷贝

#pragma once

#include pch.h

#include

#include

#include

#include

int main()

{

std::string str =

【C++ 】【move 、移动语义】左值、右值;左值引用、右值引用;移动语义;move的使用;实现资源让渡;配合unique_ptr;

多丰富下自己呀

05-05

714

系列文章目录

提示:

文章目录系列文章目录前言一、左值/右值?1.1 定义1.2 右值能修改吗?二、左值引用/右值引用?2.1引入右值引用2.2 引入右值引用的意义/目的三、move/forward?//待更新参考

前言

一、左值/右值?

1.1 定义

左值与右值(lvalue/rvalue)这两概念是从 c 中传承而来的。

在 c 中,左值指的是既能够出现在等号左边也能出现在等号右边的变量(或表达式)。

右值指的则是只能出现在等号右边的变量(或表达式)。

右值不能当成左值使用,但左值可以当成右值使

c语言 move函数,什么是C语言函数

weixin_35738619的博客

05-19

6451

什么是C语言函数else{move(n-1,x,z,y);printf("%c-->%c\n",x,z);move(n-1,y,x,z);}}main(){int h;printf("\ninput number:\n");scanf("%d",&h);printf("the step to moving %2d diskes:\n",h);move(h,'a','b','c');}...

C++ move()排序函数用法详解(深入了解,一文学会)

断点

09-05

1426

move() 算法会将它的前两个输入迭代器参数指定的序列移到第三个参数定义的目的序列的开始位置,第三个参数必须是输出迭代器。这个算法返回的迭代器指向最后一个被移动到目的序列的元素的下一个位置。这是一个移动操作,因此无法保证在进行这个操作之后,输入序列仍然保持不变;源元素仍然会存在,但它们的值可能不再相同了,因此在移动之后,就不应该再使用它们。如果源序列可以被替换或破坏,就可以选择使用 move() 算法。如果不想扰乱源序列,可以使用 copy() 算法。本文作者原创,转载请附上文章出处与本文链接。

C++move函数详解

qq_44800780的博客

12-13

5677

C++11的一个最重要特性就是支持移动语义,其中一个比较关键的函数就是std::move 那这个函数的作用是什么?

首先打开库文件 找到move的定义:

注意:不要把&&理解成引用的引用,这就是一个关键字

大概函数如下:

template

remove_reference_t&& move(T && ...

c++11新特性:move的用法和右值引用

yangzijiangac的博客

03-04

1685

首先我们来思考拷贝和移动的区别,这样你能更深刻的理解c++11为什么要推出右值引用和move了。

现来说说拷贝,以下面的例子来说明:

int f(){

int tmp=10;

return tmp;

}

int mian(){

int b=f();

return 0;

}

在主函数中,调用f()函数,为临时变量tmp申请了一块内存用来存储数据,当函数即将结束时,临时申请的这块内存要被释放掉,所以需要拷贝一份用于作为 f()函数的返回值。此时涉及了一次拷贝,还有一次拷贝是在主函数中,需要为b申请一块

c++ std::move函数

07-16

### 回答1:

c++中的std::move函数是一个重要的工具,它用于将对象的所有权从一个地方转移到另一个地方,而不进行复制或移动的开销。其实现方式是将对象的状态标记为"右值",这意味着可以被移动而不会影响原始对象的状态。

使用std::move函数可以在性能方面提供很大的优势。在某些情况下,当我们想要复制或移动一个对象时,使用std::move可以避免不必要的复制和销毁操作,从而提高程序的运行效率。

在使用std::move函数时,需要注意几个重要的事项。首先,使用std::move函数之后,原始对象的状态将会变为未定义状态,因此在使用原始对象之后,需要谨慎处理。其次,std::move只是将对象的状态标记为右值,而不会真正执行移动操作,所以移动操作的实质还是由移动构造函数或移动赋值运算符来完成。

另外,需要注意的是,使用std::move函数可以移动右值引用和临时对象,但不能移动左值引用或常量对象。如果尝试对左值进行移动操作,编译器会报错。

总之,std::move函数是c++中非常重要的一个功能,可以帮助我们优化程序的性能。通过使用std::move可以避免不必要的复制和销毁操作,从而提高程序的运行效率。但是需要注意在使用std::move之后,原始对象的状态将变为未定义状态,需要谨慎处理。

### 回答2:

c++中的std::move函数是一个用于将对象转移所有权的函数。它作为一个右值引用参数,将传入的对象的资源所有权转移到另一个对象,同时将原对象的状态设置为有效的但未定义的状态。

std::move函数的使用场景之一是在移动语义中,用于优化对象的拷贝操作。传统的拷贝操作会将资源进行复制,而使用std::move函数后可以直接将资源的所有权转移给新的对象,避免了不必要的资源复制,提高了效率。通常结合移动构造函数或者移动赋值操作符来实现。

std::move函数的另一个场景是在容器操作中,用于移动元素。当需要将一个元素从一个容器移动到另一个容器时,可以使用std::move函数来实现。通过将对象的所有权转移到目标容器,而不是进行复制操作,可以避免不必要的内存分配和数据复制,提高了性能。

需要注意的是,使用std::move函数后,原对象的状态变为有效但未定义的状态,因此在转移所有权后不能再对原对象进行操作,否则会导致未定义的行为。为了避免错误,可以使用std::move后立即将原对象设置为一个有效的、未被使用的状态,或者使用std::swap函数来交换两个对象的状态。

综上所述,std::move函数是c++中用于转移对象所有权的重要函数,能够在移动语义和容器操作中提供高效的解决方案。但是在使用时,需要注意转移所有权后原对象的状态变为未定义,需要避免对原对象进行操作,以免导致错误的结果。

### 回答3:

c++中的std::move()函数是用来将对象转移为右值引用的函数。右值引用是c++11中引入的一种新的引用类型,它可以绑定到临时对象或者即将被销毁的对象,通过右值引用,我们可以实现资源的高效转移,避免不必要的拷贝构造和析构。

std::move()函数的作用是将一个左值转换为右值引用。它的实现原理是通过类型转换将左值引用转换为右值引用,从而将对象的所有权转移给接收者。转移所有权后,原对象将变为无效状态,接收者可以对新的右值引用进行操作。

使用std::move()函数可以提高代码的性能和效率。通常在移动语义和移动构造函数中使用std::move()函数可以避免不必要的资源拷贝操作。在容器类的操作中,移动操作比拷贝操作更高效,可以减少内存的分配和释放。

当我们需要将一个对象的资源转移给另一个对象时,可以使用std::move()函数。比如在实现移动构造函数和移动赋值运算符时,我们可以使用std::move()函数将成员变量的资源转移给新对象,避免不必要的拷贝构造和析构操作。另外,在实现自定义容器时,可以使用std::move()函数在插入和删除元素时提高性能。

总之,std::move()函数是c++11中引入的一个非常有用的函数,通过将对象转移为右值引用,可以实现资源的高效转移,避免不必要的拷贝构造和析构操作,提高代码的性能和效率。在移动语义和容器类操作中,使用std::move()函数可以达到更好的效果。

“相关推荐”对你有帮助么?

非常没帮助

没帮助

一般

有帮助

非常有帮助

提交

KNGG

CSDN认证博客专家

CSDN认证企业博客

码龄3年

暂无认证

7

原创

102万+

周排名

154万+

总排名

2万+

访问

等级

141

积分

616

粉丝

52

获赞

22

评论

135

收藏

私信

关注

热门文章

C++:move,带你从根本理解move函数是什么

14944

行为树游戏AI设计

3680

状态机游戏AI设计

3171

C++:引用,万能引用,引用折叠,std::forward一次带你搞明白

2707

C++:const ,帮你理解所有有关const的一切

1703

分类专栏

C++

5篇

游戏开发

2篇

最新评论

C++:move,带你从根本理解move函数是什么

for_sun_read:

最近在想,list,map,vector这些pushback非指针量后,离开作用域,居然还能用是什么原因,看了文章还有你的评论,一下子明白了

C++:move,带你从根本理解move函数是什么

InsaneGe:

左值是表达式结束后依然存在的持久对象(代表一个在内存中占有确定位置的对象)

右值是表达式结束时不再存在的临时对象(不在内存中占有确定位置的表达式)

看别的博客,这么解释左值右值更清晰些

C++多态,不止虚函数虚表

onlynovice:

博主你好,最后一段代码中的Print()函数应该这样写:

[code=cpp]

template

void Print(Food& food)

{

food.Flop();

}

[/code]

这样才可以通过基类的Flop函数访问派生类的Flop,否则最后一段代码和倒数第二段代码的原理相同,都是通过模板推导直接访问派生类的Flop。

此外,如果如我所写的这样使用CRTP,需要把Flop函数的const去掉,要不然无法用static_cast把const Derived* 转为Derived*,编译出错。

C++:const ,帮你理解所有有关const的一切

fairun:

大佬,先作用于左边怎么理解。。

C++多态,不止虚函数虚表

dakerhk:

大佬牛皮

您愿意向朋友推荐“博客详情页”吗?

强烈不推荐

不推荐

一般般

推荐

强烈推荐

提交

最新文章

C++:可变参模板,什么才是可变参模板?

C++:引用,万能引用,引用折叠,std::forward一次带你搞明白

C++:const ,帮你理解所有有关const的一切

2022年7篇

目录

目录

分类专栏

C++

5篇

游戏开发

2篇

目录

评论 9

被折叠的  条评论

为什么被折叠?

到【灌水乐园】发言

查看更多评论

添加红包

祝福语

请填写红包祝福语或标题

红包数量

红包个数最小为10个

红包总金额

红包金额最低5元

余额支付

当前余额3.43元

前往充值 >

需支付:10.00元

取消

确定

下一步

知道了

成就一亿技术人!

领取后你会自动成为博主和红包主的粉丝

规则

hope_wisdom 发出的红包

打赏作者

KNGG

你的鼓励将是我创作的最大动力

¥1

¥2

¥4

¥6

¥10

¥20

扫码支付:¥1

获取中

扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元

使用余额支付

点击重新获取

扫码支付

钱包余额

0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

一文读懂C++右值引用和std::move - 知乎

一文读懂C++右值引用和std::move - 知乎首发于腾讯技术切换模式写文章登录/注册一文读懂C++右值引用和std::move腾讯技术工程​编程话题下的优秀答主作者:rickonji 冀铭哲 C++11引入了右值引用,有一定的理解成本,工作中发现不少同事对右值引用理解不深,认为右值引用性能更高等等。本文从实用角度出发,用尽量通俗易懂的语言讲清左右值引用的原理,性能分析及其应用场景,帮助大家在日常编程中用好右值引用和std::move。 1. 什么是左值、右值首先不考虑引用以减少干扰,可以从2个角度判断:左值可以取地址、位于等号左边;而右值没法取地址,位于等号右边。int a = 5;

a可以通过 & 取地址,位于等号左边,所以a是左值。5位于等号右边,5没法通过 & 取地址,所以5是个右值。再举个例子:struct A {

A(int a = 0) {

a_ = a;

}

int a_;

};

A a = A();

同样的,a可以通过 & 取地址,位于等号左边,所以a是左值。A()是个临时值,没法通过 & 取地址,位于等号右边,所以A()是个右值。可见左右值的概念很清晰,有地址的变量就是左值,没有地址的字面值、临时值就是右值。2. 什么是左值引用、右值引用引用本质是别名,可以通过引用修改变量的值,传参时传引用可以避免拷贝,其实现原理和指针类似。 个人认为,引用出现的本意是为了降低C语言指针的使用难度,但现在指针+左右值引用共同存在,反而大大增加了学习和理解成本。2.1 左值引用左值引用大家都很熟悉,能指向左值,不能指向右值的就是左值引用:int a = 5;

int &ref_a = a; // 左值引用指向左值,编译通过

int &ref_a = 5; // 左值引用指向了右值,会编译失败

引用是变量的别名,由于右值没有地址,没法被修改,所以左值引用无法指向右值。但是,const左值引用是可以指向右值的:const int &ref_a = 5; // 编译通过

const左值引用不会修改指向值,因此可以指向右值,这也是为什么要使用const &作为函数参数的原因之一,如std::vector的push_back:void push_back (const value_type& val);

如果没有const,vec.push_back(5)这样的代码就无法编译通过了。2.2 右值引用再看下右值引用,右值引用的标志是&&,顾名思义,右值引用专门为右值而生,可以指向右值,不能指向左值:int &&ref_a_right = 5; // ok

int a = 5;

int &&ref_a_left = a; // 编译不过,右值引用不可以指向左值

ref_a_right = 6; // 右值引用的用途:可以修改右值

2.3 对左右值引用本质的讨论下边的论述比较复杂,也是本文的核心,对理解这些概念非常重要。2.3.1 右值引用有办法指向左值吗?有办法,std::move:int a = 5; // a是个左值

int &ref_a_left = a; // 左值引用指向左值

int &&ref_a_right = std::move(a); // 通过std::move将左值转化为右值,可以被右值引用指向

cout << a; // 打印结果:5

在上边的代码里,看上去是左值a通过std::move移动到了右值ref_a_right中,那是不是a里边就没有值了?并不是,打印出a的值仍然是5。std::move是一个非常有迷惑性的函数,不理解左右值概念的人们往往以为它能把一个变量里的内容移动到另一个变量,但事实上std::move移动不了什么,唯一的功能是把左值强制转化为右值,让右值引用可以指向左值。其实现等同于一个类型转换:static_cast(lvalue)。 所以,单纯的std::move(xxx)不会有性能提升,std::move的使用场景在第三章会讲。同样的,右值引用能指向右值,本质上也是把右值提升为一个左值,并定义一个右值引用通过std::move指向该左值:int &&ref_a = 5;

ref_a = 6;

等同于以下代码:

int temp = 5;

int &&ref_a = std::move(temp);

ref_a = 6;

2.3.2 左值引用、右值引用本身是左值还是右值?被声明出来的左、右值引用都是左值。 因为被声明出的左右值引用是有地址的,也位于等号左边。仔细看下边代码:// 形参是个右值引用

void change(int&& right_value) {

right_value = 8;

}

int main() {

int a = 5; // a是个左值

int &ref_a_left = a; // ref_a_left是个左值引用

int &&ref_a_right = std::move(a); // ref_a_right是个右值引用

change(a); // 编译不过,a是左值,change参数要求右值

change(ref_a_left); // 编译不过,左值引用ref_a_left本身也是个左值

change(ref_a_right); // 编译不过,右值引用ref_a_right本身也是个左值

change(std::move(a)); // 编译通过

change(std::move(ref_a_right)); // 编译通过

change(std::move(ref_a_left)); // 编译通过

change(5); // 当然可以直接接右值,编译通过

cout << &a << ' ';

cout << &ref_a_left << ' ';

cout << &ref_a_right;

// 打印这三个左值的地址,都是一样的

}

看完后你可能有个问题,std::move会返回一个右值引用int &&,它是左值还是右值呢? 从表达式int &&ref = std::move(a)来看,右值引用ref指向的必须是右值,所以move返回的int &&是个右值。所以右值引用既可能是左值,又可能是右值吗? 确实如此:右值引用既可以是左值也可以是右值,如果有名称则为左值,否则是右值。或者说:作为函数返回值的 && 是右值,直接声明出来的 && 是左值。 这同样也符合第一章对左值,右值的判定方式:其实引用和普通变量是一样的,int &&ref = std::move(a)和 int a = 5没有什么区别,等号左边就是左值,右边就是右值。最后,从上述分析中我们得到如下结论:从性能上讲,左右值引用没有区别,传参使用左右值引用都可以避免拷贝。右值引用可以直接指向右值,也可以通过std::move指向左值;而左值引用只能指向左值(const左值引用也能指向右值)。作为函数形参时,右值引用更灵活。虽然const左值引用也可以做到左右值都接受,但它无法修改,有一定局限性。void f(const int& n) {

n += 1; // 编译失败,const左值引用不能修改指向变量

}

void f2(int && n) {

n += 1; // ok

}

int main() {

f(5);

f2(5);

}

3. 右值引用和std::move的应用场景按上文分析,std::move只是类型转换工具,不会对性能有好处;右值引用在作为函数形参时更具灵活性,看上去还是挺鸡肋的。他们有什么实际应用场景吗?3.1 实现移动语义在实际场景中,右值引用和std::move被广泛用于在STL和自定义类中实现移动语义,避免拷贝,从而提升程序性能。 在没有右值引用之前,一个简单的数组类通常实现如下,有构造函数、拷贝构造函数、赋值运算符重载、析构函数等。深拷贝/浅拷贝在此不做讲解。class Array {

public:

Array(int size) : size_(size) {

data = new int[size_];

}

// 深拷贝构造

Array(const Array& temp_array) {

size_ = temp_array.size_;

data_ = new int[size_];

for (int i = 0; i < size_; i ++) {

data_[i] = temp_array.data_[i];

}

}

// 深拷贝赋值

Array& operator=(const Array& temp_array) {

delete[] data_;

size_ = temp_array.size_;

data_ = new int[size_];

for (int i = 0; i < size_; i ++) {

data_[i] = temp_array.data_[i];

}

}

~Array() {

delete[] data_;

}

public:

int *data_;

int size_;

};

该类的拷贝构造函数、赋值运算符重载函数已经通过使用左值引用传参来避免一次多余拷贝了,但是内部实现要深拷贝,无法避免。 这时,有人提出一个想法:是不是可以提供一个移动构造函数,把被拷贝者的数据移动过来,被拷贝者后边就不要了,这样就可以避免深拷贝了,如:class Array {

public:

Array(int size) : size_(size) {

data = new int[size_];

}

// 深拷贝构造

Array(const Array& temp_array) {

...

}

// 深拷贝赋值

Array& operator=(const Array& temp_array) {

...

}

// 移动构造函数,可以浅拷贝

Array(const Array& temp_array, bool move) {

data_ = temp_array.data_;

size_ = temp_array.size_;

// 为防止temp_array析构时delete data,提前置空其data_

temp_array.data_ = nullptr;

}

~Array() {

delete [] data_;

}

public:

int *data_;

int size_;

};

这么做有2个问题:不优雅,表示移动语义还需要一个额外的参数(或者其他方式)。无法实现!temp_array是个const左值引用,无法被修改,所以temp_array.data_ = nullptr;这行会编译不过。当然函数参数可以改成非const:Array(Array& temp_array, bool move){...},这样也有问题,由于左值引用不能接右值,Array a = Array(Array(), true);这种调用方式就没法用了。可以发现左值引用真是用的很不爽,右值引用的出现解决了这个问题,在STL的很多容器中,都实现了以右值引用为参数的移动构造函数和移动赋值重载函数,或者其他函数,最常见的如std::vector的push_back和emplace_back。参数为左值引用意味着拷贝,为右值引用意味着移动。class Array {

public:

......

// 优雅

Array(Array&& temp_array) {

data_ = temp_array.data_;

size_ = temp_array.size_;

// 为防止temp_array析构时delete data,提前置空其data_

temp_array.data_ = nullptr;

}

public:

int *data_;

int size_;

};

如何使用:// 例1:Array用法

int main(){

Array a;

// 做一些操作

.....

// 左值a,用std::move转化为右值

Array b(std::move(a));

}

3.2 实例:vector::push_back使用std::move提高性能// 例2:std::vector和std::string的实际例子

int main() {

std::string str1 = "aacasxs";

std::vector vec;

vec.push_back(str1); // 传统方法,copy

vec.push_back(std::move(str1)); // 调用移动语义的push_back方法,避免拷贝,str1会失去原有值,变成空字符串

vec.emplace_back(std::move(str1)); // emplace_back效果相同,str1会失去原有值

vec.emplace_back("axcsddcas"); // 当然可以直接接右值

}

// std::vector方法定义

void push_back (const value_type& val);

void push_back (value_type&& val);

void emplace_back (Args&&... args);

在vector和string这个场景,加个std::move会调用到移动语义函数,避免了深拷贝。除非设计不允许移动,STL类大都支持移动语义函数,即可移动的。 另外,编译器会默认在用户自定义的class和struct中生成移动语义函数,但前提是用户没有主动定义该类的拷贝构造等函数(具体规则自行百度哈)。 因此,可移动对象在<需要拷贝且被拷贝者之后不再被需要>的场景,建议使用std::move触发移动语义,提升性能。moveable_objecta = moveable_objectb;

改为:

moveable_objecta = std::move(moveable_objectb);

还有些STL类是move-only的,比如unique_ptr,这种类只有移动构造函数,因此只能移动(转移内部对象所有权,或者叫浅拷贝),不能拷贝(深拷贝):std::unique_ptr ptr_a = std::make_unique();

std::unique_ptr ptr_b = std::move(ptr_a); // unique_ptr只有‘移动赋值重载函数‘,参数是&& ,只能接右值,因此必须用std::move转换类型

std::unique_ptr ptr_b = ptr_a; // 编译不通过

std::move本身只做类型转换,对性能无影响。 我们可以在自己的类中实现移动语义,避免深拷贝,充分利用右值引用和std::move的语言特性。4. 完美转发 std::forward和std::move一样,它的兄弟std::forward也充满了迷惑性,虽然名字含义是转发,但他并不会做转发,同样也是做类型转换.与move相比,forward更强大,move只能转出来右值,forward都可以。 std::forward(u)有两个参数:T与 u。 a. 当T为左值引用类型时,u将被转换为T类型的左值; b. 否则u将被转换为T类型右值。 举个例子,有main,A,B三个函数,调用关系为:main->A->B,建议先看懂2.3节对左右值引用本身是左值还是右值的讨论再看这里:void B(int&& ref_r) {

ref_r = 1;

}

// A、B的入参是右值引用

// 有名字的右值引用是左值,因此ref_r是左值

void A(int&& ref_r) {

B(ref_r); // 错误,B的入参是右值引用,需要接右值,ref_r是左值,编译失败

B(std::move(ref_r)); // ok,std::move把左值转为右值,编译通过

B(std::forward(ref_r)); // ok,std::forward的T是int类型,属于条件b,因此会把ref_r转为右值

}

int main() {

int a = 5;

A(std::move(a));

}

例2:void change2(int&& ref_r) {

ref_r = 1;

}

void change3(int& ref_l) {

ref_l = 1;

}

// change的入参是右值引用

// 有名字的右值引用是 左值,因此ref_r是左值

void change(int&& ref_r) {

change2(ref_r); // 错误,change2的入参是右值引用,需要接右值,ref_r是左值,编译失败

change2(std::move(ref_r)); // ok,std::move把左值转为右值,编译通过

change2(std::forward(ref_r)); // ok,std::forward的T是右值引用类型(int &&),符合条件b,因此u(ref_r)会被转换为右值,编译通过

change3(ref_r); // ok,change3的入参是左值引用,需要接左值,ref_r是左值,编译通过

change3(std::forward(ref_r)); // ok,std::forward的T是左值引用类型(int &),符合条件a,因此u(ref_r)会被转换为左值,编译通过

// 可见,forward可以把值转换为左值或者右值

}

int main() {

int a = 5;

change(std::move(a));

}

上边的示例在日常编程中基本不会用到,std::forward最主要运于模版编程的参数转发中,想深入了解需要学习万能引用(T &&)和引用折叠(eg:& && → ?)等知识,本文就不详细介绍这些了。如有错误,请指正!更多干货尽在腾讯技术,官方微信交流群已建立,交流讨论可加:Journeylife1900(备注腾讯技术) 。编辑于 2020-12-11 10:29C++11指针(编程)C / C++​赞同 2766​​164 条评论​分享​喜欢​收藏​申请转载​文章被以下专栏收录腾讯技术跟腾讯技术相关的文章都在

C++ move()函数_c++move-CSDN博客

>

C++ move()函数_c++move-CSDN博客

C++ move()函数

最新推荐文章于 2024-01-09 21:03:35 发布

chengjian168

最新推荐文章于 2024-01-09 21:03:35 发布

阅读量2.4w

收藏

214

点赞数

72

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/chengjian168/article/details/107809308

版权

要了解move函数首先弄清左值引用和右值引用。

左值、左值引用、右值、右值引用

1、左值和右值的概念

         左值是可以放在赋值号左边可以被赋值的值;左值必须要在内存中有实体;          右值当在赋值号右边取出值赋给其他变量的值;右值可以在内存也可以在CPU寄存器。          一个对象被用作右值时,使用的是它的内容(值),被当作左值时,使用的是它的地址。

2、引用

        引用是C++语法做的优化,引用的本质还是靠指针来实现的。引用相当于变量的别名。

        引用可以改变指针的指向,还可以改变指针所指向的值。

        引用的基本规则:

声明引用的时候必须初始化,且一旦绑定,不可把引用绑定到其他对象;即引用必须初始化,不能对引用重定义;对引用的一切操作,就相当于对原对象的操作。

3、左值引用和右值引用

    3.1 左值引用          左值引用的基本语法:type &引用名 = 左值表达式;     3.2 右值引用

        右值引用的基本语法type &&引用名 = 右值表达式;

        右值引用在企业开发人员在代码优化方面会经常用到。

        右值引用的“&&”中间不可以有空格。

std::move并不能移动任何东西,它唯一的功能是将一个左值强制转化为右值引用,继而可以通过右值引用使用该值,以用于移动语义。从实现上讲,std::move基本等同于一个类型转换:static_cast(lvalue);C++ 标准库使用比如vector::push_back 等这类函数时,会对参数的对象进行复制,连数据也会复制.这就会造成对象内存的额外创建, 本来原意是想把参数push_back进去就行了,通过std::move,可以避免不必要的拷贝操作。std::move是为性能而生。std::move是将对象的状态或者所有权从一个对象转移到另一个对象,只是转移,没有内存的搬迁或者内存拷贝。

用法:

原lvalue值被moved from之后值被转移,所以为空字符串. 

#include

#include

#include

#include

int main()

{

std::string str = "Hello";

std::vector v;

//调用常规的拷贝构造函数,新建字符数组,拷贝数据

v.push_back(str);

std::cout << "After copy, str is \"" << str << "\"\n";

//调用移动构造函数,掏空str,掏空后,最好不要使用str

v.push_back(std::move(str));

std::cout << "After move, str is \"" << str << "\"\n";

std::cout << "The contents of the vector are \"" << v[0]

<< "\", \"" << v[1] << "\"\n";

}

输出:

After copy, str is "Hello"

After move, str is ""

The contents of the vector are "Hello", "Hello"

 

优惠劵

chengjian168

关注

关注

72

点赞

214

收藏

觉得还不错?

一键收藏

知道了

7

评论

C++ move()函数

要了解move函数首先弄清左值引用和右值引用。左值、左值引用、右值、右值引用1、左值和右值的概念 左值是可以放在赋值号左边可以被赋值的值;左值必须要在内存中有实体; 右值当在赋值号右边取出值赋给其他变量的值;右值可以在内存也可以在CPU寄存器。 一个对象被用作右值时,使用的是它的内容(值),被当作左值时,使用的是它的地址。2、引用 引用是C++语法做的优化,引用的本质还是靠指针来实现的。引用相当于变量的别名。 ...

复制链接

扫一扫

基于C++,在主函数中输入10个整数到数组中,调用函数move()完成将数组元素循环移动k位,适合新手

05-26

在主函数中输入10个整数到数组中,调用函数move()完成将数组元素循环移动k位(要求函数参数为:1数组名;2数组元素个数;3循环移动的位数k)。当k>0时,实现循环右移;当k时,实现循环左移。循环右移一位的意义是:将...

C++11中std::move、std::forward、左右值引用、移动构造函数的测试问题

09-08

主要介绍了C++11中std::move、std::forward、左右值引用、移动构造函数的测试,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

7 条评论

您还未登录,请先

登录

后发表或查看评论

c++ std::move()到底干了什么

最新发布

zhaoyqcsdn的博客

01-09

945

实际上,std::move() 并不执行任何实际的操作,它只是一个简单的类型转换工具,用于告诉编译器将一个对象视为右值,以便在移动语义的上下文中使用。通过使用 std::move(),你可以在某些情况下提高程序的性能,例如在移动语义可用的情况下,显式地调用移动构造函数或移动赋值运算符。std::move() 是 C++ 中一个很有用的函数,它用于将传递给它的对象转换为右值引用。std::move()的实现非常简单,它实际上只是将传递给它的对象强制转换为对应的右值引用。

C++11——移动构造函数及std::move() 的使用

ShenHang_的博客

04-23

1万+

td::move是将对象的状态或者所有权从一个对象转移到另一个对象,只是转移,没有内存的搬迁或者内存拷贝。

如string类在赋值或者拷贝构造函数中会声明char数组来存放数据,然后把原string中的 char 数组被析构函数释放,如果a是一个临时变量,则上面的拷贝,析构就是多余的,完全可以把临时变量a中的数据直接 “转移” 到新的变量下面即可。

#include

移动操作【右值引用,std::move(),移动拷贝(赋值)函数】

总结和收藏

03-02

369

为了支持移动操作(高效),右值引用,std::move(),移动拷贝(赋值)函数。其中移动拷贝(赋值)函数以右值引用为参数,做函数匹配时【左值拷贝,右值移动】。std::move()作为左值到右值引用地转换函数【桥梁】,以达到“左值移动,避免拷贝”,代价是左值变量被窃取【保证赋值与销毁】

move()“函数“在节省空间中的应用

一只小萌新的博客

01-20

351

1.20小记之move函数在节省空间中的应用前言一、move()函数二、作用2.1 std::move()是什么?2.2 std::move()能做什么?2.3 什么时候用?

前言

  今天刷力扣时遇到问题,看到答案后发现不同点在于c++的move函数,我将其删除后发现也可以AC,后查阅相关资料,得到解答,在此做记录。

一、move()函数

  C++ 11中出现了move函数,自己平时几乎没使用过,在查阅《代码整洁之道》《c++性能优化指南》等书籍的时候都对该函数有推荐,不过这其中涉及到了其他的知识,比如

C++:move,带你从根本理解move函数是什么

热门推荐

qq_51568363的博客

04-20

1万+

一: std::move

这个C++专栏都到第三篇博客了,希望大家看完有用的话可以康康博主往期的博客,有兴趣的话可以关注一下,嘻嘻,不说了,说到move离不开的就是,移动语义和值类型,那我们就从值类型先入手吧!

1.值类型(value category)

...

一文带你详细介绍c++中的std::move函数

zhangmiaoping23的专栏

07-29

1万+

将vectorB赋值给另一个vectorA,如果是拷贝赋值,那么显然要对B中的每一个元素执行一个copy操作到A,如果是移动赋值的话,只需要将指向B的指针拷贝到A中即可,试想一下如果vector中有相当多的元素,那是不是用move来代替copy就显得十分高效了呢?上述例子中,由于在之前已经对变量val进行了定义,故在栈上会给val分配内存地址,运算符=要求等号左边是可修改的左值,4是临时参与运算的值,一般在寄存器上暂存,运算结束后在寄存器上移除该值,故①是对的,②是错的。.........

std::move & 左值右值 &左值引用右值引用

s11show_163的博客

03-02

1754

一句话概括std::move ———— std::move是将对象的状态或者所有权从一个对象转移到另一个对象,只是转移,没有内存的搬迁或者内存拷贝。

好了,下面系统的讲

右值引用(及其支持的Move语意和完美转发)是C++0x加入的最重大语言特性之一。从实践角度讲,它能够完美解决C++中长久以来为人所诟病的****临时对象效率问题。从语言本身讲,它健全了C++中的引用类型在左值右值方面的缺陷。从库设计者的角度讲,它给库设计者又带来了一把利器。从库使用者的角度讲,不动一兵一卒便可以获得“免费的”效率提升。

C++中move的使用

qq_41902325的博客

06-25

1万+

1.引言

在学习move使用的时候首先要分清C++中的左值和右值。

因为关于左值和右值区分比较复杂,我们可以采取一个简化的观点,这将在很大程度上满足我们的目的。

左值

最简单的做法是将左值(也称为定位器值)看作函数或对象(或计算为函数或对象的表达式)。所有的左值都分配了内存地址。最初定义左值时,它们被定义为“适合于赋值表达式左侧的值”。但是,后来在语言中添加了const关键字,左值被分为两个子类:可修改的左值(可以更改)和不可修改的左值(const)。

右值

最简单的做法是把右值想象成“所有不是左值的东西”

psmove Unity5插件

12-19

psmove Unity5插件,结合ps3eye,用于控制游戏,vr,精度可以

C++中的移动构造函数及move语句示例详解

01-20

前言

本文主要给大家介绍了关于C++中移动构造函数及move语句的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。

首先看一个小例子:

#include

#include

#include

#include

using namespace std;

int main()

{

string st = I love xing;

vector vc ;

vc.push_back(move(st));

cout<

if(!st.empty(

c++11 std::move() 的使用

01-07

std::move函数可以以非常简单的方式将左值引用转换为右值引用。(左值、左值引用、右值、右值引用 参见:http://www.cnblogs.com/SZxiaochun/p/8017475.html) 通过std::move,可以避免不必要的拷贝操作。 std::move...

c++中虚函数和纯虚函数的作用与区别

12-31

虚函数为了重载和多态的需要,在基类中是有定义的,即便定义是空,所以子类中...void Move(); private: }; class CChild : public CMan { public: virtual void Eat(){……}; private: }; CMan m_man; CChild m_chil

C++实现moveto

07-25

这个不太完整,但是绝对有用,可以帮你解决好多问题

MFC(C++)使用SetPixel和LineTo函数绘制直线

09-22

计算机图形学第二章课后题第三题,使用MFC中的SetPixel函数和MoveTo函数、LineTo函数绘制直线(根据坐标)

C++ Qt创建多线程的2种方式:重写run函数,使用moveToThread【应该早点知道的】源码示例

11-14

Qt创建多线程的方式有4种,大多数情况下使用2种就可以了; 前提:  什么是线程,多线程,什么时候使用多线程?... 2、使用moveToThread函数 参考帖子:https://blog.csdn.net/mars1199/article/details/134402344

Effective Modern C++

01-01

《Effective Modern C++:改善C++11和C++14的42个具体做法(影印版)(英文版)》中包括以下主题:剖析花括号初始化、noexcept规范、完美转发、智能指针make函数的优缺点;讲解std∷move,std∷forward,rvalue引用和全局...

C++ move函数详解

06-13

C++ 的 move 函数是一个非常有用的函数,它用于将一个对象的内容移动到另一个对象中,而不是拷贝。通过移动而不是拷贝,可以避免不必要的内存分配和释放,从而提高程序的性能。

move 函数的定义如下:

```cpp

template typename remove_reference::type&& move(T&& arg) noexcept;

```

其中,`T` 表示要移动的对象的类型。`move` 函数的参数是一个右值引用,这意味着可以将一个临时对象或者一个将要被销毁的对象传递给它。函数返回一个右值引用,表示移动后的对象。

使用 `move` 函数需要注意以下几点:

1. 只有在需要将一个对象的内容移动到另一个对象中时才应该使用 `move` 函数。

2. 移动后的对象可能会变得无效,因此在移动后应该避免对移动前的对象进行操作。

3. 对于内置类型和标准库类型,移动函数已经被正确实现,无需自己实现。

下面是一个使用 `move` 函数的例子:

```cpp

#include

#include

#include

using namespace std;

int main()

{

vector vec1{"Hello", "World"}; // 创建一个 vector 对象

vector vec2{move(vec1)}; // 移动 vec1 的内容到 vec2 中

cout << vec1.size() << endl; // 输出 0,因为 vec1 已经被移动了

cout << vec2.size() << endl; // 输出 2,因为 vec2 中有两个元素

return 0;

}

```

在上面的例子中,我们创建了一个 vector 对象 `vec1`,然后将它的内容移动到另一个 vector 对象 `vec2` 中。由于移动后 `vec1` 变得无效,因此在输出 `vec1.size()` 时会得到 0。而 `vec2` 中有两个元素,因此输出 `vec2.size()` 时会得到 2。

“相关推荐”对你有帮助么?

非常没帮助

没帮助

一般

有帮助

非常有帮助

提交

chengjian168

CSDN认证博客专家

CSDN认证企业博客

码龄7年

暂无认证

3

原创

34万+

周排名

49万+

总排名

2万+

访问

等级

238

积分

3

粉丝

74

获赞

7

评论

226

收藏

私信

关注

热门文章

C++ move()函数

24808

C++ vector 底层实现

1951

多进程和多线程的区别

168

单例模式

135

c++ new 与malloc有什么区别

111

最新评论

C++ move()函数

cyhsdgf:

优秀的文章

C++ move()函数

阿祖卡布珈德:

内存上不连续就不连续呗,影响不大

C++ move()函数

Bugs清道夫:

应该还是有内存拷贝的,一般的=赋值有两次内存拷贝,move只有一次了

C++ move()函数

wongzzzhh:

在内存上可能不是连续的,但是逻辑上连续的。影响不大,可能会造成内存碎片多些。

C++ move()函数

Bugs清道夫:

那访问容器内容的时候岂不是每次都要去找内容到底在哪里?容器里的数据都不是连续的了。

您愿意向朋友推荐“博客详情页”吗?

强烈不推荐

不推荐

一般般

推荐

强烈推荐

提交

最新文章

多进程和多线程的区别

单例模式

C++ vector 底层实现

2020年5篇

目录

目录

最新文章

多进程和多线程的区别

单例模式

C++ vector 底层实现

2020年5篇

目录

评论 7

被折叠的  条评论

为什么被折叠?

到【灌水乐园】发言

查看更多评论

添加红包

祝福语

请填写红包祝福语或标题

红包数量

红包个数最小为10个

红包总金额

红包金额最低5元

余额支付

当前余额3.43元

前往充值 >

需支付:10.00元

取消

确定

下一步

知道了

成就一亿技术人!

领取后你会自动成为博主和红包主的粉丝

规则

hope_wisdom 发出的红包

实付元

使用余额支付

点击重新获取

扫码支付

钱包余额

0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

move是什么意思_move的翻译_音标_读音_用法_例句_爱词霸在线词典

是什么意思_move的翻译_音标_读音_用法_例句_爱词霸在线词典首页翻译背单词写作校对词霸下载用户反馈专栏平台登录move是什么意思_move用英语怎么说_move的翻译_move翻译成_move的中文意思_move怎么读,move的读音,move的用法,move的例句翻译人工翻译试试人工翻译翻译全文简明柯林斯牛津move高中/CET4/CET6英 [muːv]美 [muːv]释义常用高考讲解v.移动; 改变; 进步; 采取行动; 搬家; 调动; 走棋; 转移话题; 动摇; 促使; 感动; 提议n.行动; 移动; 改变; 搬家; 步骤; 一步(棋)大小写变形:MOVE点击 人工翻译,了解更多 人工释义词态变化复数: moves;第三人称单数: moves;过去式: moved;过去分词: moved;现在分词: moving;实用场景例句全部移动搬动搬家行动进展开动提议摇动变化改变迁移She moved the sheaf of papers into position...她把那捆报纸挪到合适的地方。柯林斯高阶英语词典You can move the camera both vertically and horizontally...你可以上下左右移动摄像机。柯林斯高阶英语词典She waited for him to get up, but he didn't move...她等他起床,但他没动弹。柯林斯高阶英语词典There was so much furniture you could hardly move without bumping into something...家具太多,稍挪步就会撞到什么东西上。柯林斯高阶英语词典Industrialists must move fast to take advantage of new opportunities in Eastern Europe.实业家们必须尽快采取行动,抓住东欧的新机遇。柯林斯高阶英语词典The one point cut in interest rates was a wise move...将利率降低一个点是明智的举措。柯林斯高阶英语词典It may also be a good move to suggest she talks things over...建议她把事情谈开了也许是不错的做法。柯林斯高阶英语词典My family home is in York-shire and they don't want to move...我家人住在约克郡,他们不打算搬家。柯林斯高阶英语词典She had often considered moving to London...她过去常想搬到伦敦去住。柯林斯高阶英语词典His superiors moved him to another parish...上级把他派往另一个教区。柯林斯高阶英语词典Ms Clark is still in position and there are no plans to move her...克拉克女士仍然在位,没有要调动她的计划。柯林斯高阶英语词典He moved from being an extramural tutor to being a lecturer in social history...他原先是一名校外辅导老师,后调入学校讲授社会史。柯林斯高阶英语词典In the early days Christina moved jobs to get experience.起初克里斯蒂娜更换不同的工作来积累经验。柯林斯高阶英语词典Let's move to another subject, Dan.丹,我们换个话题吧。柯林斯高阶英语词典The club has moved its meeting to Saturday, January 22nd...俱乐部把会议日期改到1月22号,星期六。柯林斯高阶英语词典The band have moved forward their Leeds date to October 27.乐队已把去利兹的日期提前至10月27号。柯林斯高阶英语词典The Labour Party has moved to the right and become like your Democrat Party...工党已右倾化了,变得像你们民主党。柯林斯高阶英语词典It is already possible to start moving toward the elimination of nuclear weapons...已有可能朝着消除核武器的目标努力。柯林斯高阶英语词典Events are moving fast...事件进展迅速。柯林斯高阶英语词典Someone has got to get things moving.应该有人牵头把事情做起来。柯林斯高阶英语词典Everyone thought I was mad to go back, but I wouldn't be moved.大家都认为我回去是很不明智的,但我不会动摇。柯林斯高阶英语词典It was punk that first moved him to join a band seriously...最初是朋克摇滚乐促使他正式加入了乐队。柯林斯高阶英语词典The president was moved to come up with these suggestions after the hearings.听证会促使总统想出了这些建议。柯林斯高阶英语词典These stories surprised and moved me...这些故事让我吃惊,也让我感动。柯林斯高阶英语词典His prayer moved me to tears.他的祈祷把我感动得热泪盈眶。柯林斯高阶英语词典She moves in high-society circles in London...她时常出入伦敦的上流社会。柯林斯高阶英语词典They moved in a world where hostility to racists was natural.他们出没在一个对种族主义者的敌视习以为常的世界里。柯林斯高阶英语词典Labour quickly moved a closure motion to end the debate...工党很快提出终止辩论的动议。柯林斯高阶英语词典I move that the case be dismissed.我提议对该案不予受理。柯林斯高阶英语词典With no idea of what to do for my next move, my hand hovered over the board.我举着棋子,不知下一步该怎么走。柯林斯高阶英语词典收起实用场景例句真题例句全部四级六级高考考研Where are you in the cycle of renewal: Are you actively preserving the present, or selectively forgetting the past, or boldly creating the future? What advice would Leah give you to move you ahead on your journey? Once we're on the path of growth, we can continually move through the seasons of transformation and renewal.出自-2017年6月阅读原文The middle-aged person, Barth continued, can see death in the distance, but moves with a measured haste to get big new things done while there is still time.出自-2017年6月阅读原文Soon after, she knew she had to make a bold move to fully commit to her new future.出自-2017年6月阅读原文After that, survey respondents disagree over whether this generation will follow in their parents' footsteps, moving to the suburbs to raise families, or will choose to remain in the city center.出自-2017年6月阅读原文One of the creatures made a dramatic appearance by moving on to the head of the team leader as he slept.出自-2017年6月听力原文Whether residents felt involved in the decision to move and how long they had lived there also proved significant.出自-2016年6月阅读原文The daughter feared her mother would be ignored there, and so she decided to move her into a more welcoming facility.出自-2016年6月阅读原文Such moves may eliminate the fears of those living in the exporting countries, but they are creating panic in importing countries that must rely on what is then left for export.出自-2016年6月阅读原文On the demand side, those trends include the ongoing addition of more than 70 million people a year, a growing number of people wanting to move up the food chain to consume -72- highly grain-intensive meat products, and the massive diversion ( ' , 转向) of U.S. grain to the production of bio-fuel.出自-2016年6月阅读原文And that the characteristics adult children look for when they begin the search are not necessarily the things that make a difference to the people who are going to move in.出自-2016年6月阅读原文A resident's satisfaction with a care facility has much to do with whether they had participated in the decision to move in and how long they had stayed there.出自-2016年6月阅读原文A person who had input into where he would move and has had time to adapt to it might do as well in a nursing home as in a small residential care home, other factors being equal.出自-2016年6月阅读原文On Sunday, the castle’s owner John Gordon, 76, was forced to move out his property after the River Dee swept away about 60 feet of land, leaving the castle dangerously close to the river, according to the Scottish Daily Record.出自-2016年12月听力原文Last week, for example, Postmaster General Pat Donahoe announced plans to stop mail delivery on Saturdays, a move he says could save three billion dollars annually.出自-2016年12月听力原文The objective of this debating game is not to win but to get to the truth that will allow you to move faster, farther and better.出自-2015年12月阅读原文Instead of digging through pieces of paper and peering into corners, we move our fingers left and right.出自-2015年12月阅读原文If you could get the right ten thousand people to move from Silicon Valley to Buffalo, Buffalo would become Silicon Valley.出自-2015年12月阅读原文For instance, you can move a TV to the kitchen and watch your favorite shows while you're standing at the sink.出自-2015年12月阅读原文"The move to recapture a small part of the profits from an industry that pushes a product that contributes to diabetes, obesity and heart disease in poorer communities in order to reinvest in those communities will sure be inspirational to many other plac2019年12月四级真题(第一套)阅读 Section CI guess I should recognize my mistakes and learn the lesson they teach me and move forward.2019年12月四级真题(第一套)听力 Section BIf you could get the right ten thousand people to move from silicon Valley to Buffalo, Buffalo would become Silicon Valley.2015年12月四级真题(第二套)阅读 Section CIn a three-stage life, people leave university at the same time and the same age, they tend to start their careers and family at the same age, they proceed through middle management all roughly the same time, and then move into retirement within a few yea2019年6月四级真题(第一套)阅读 Section BIt was not known, however, whether central fatigue might also affect motor systems not directly involved in the exercise itself, such as those that move the eyes.2017年6月四级真题(第三套)阅读 Section AKomada likes to teach his students that they should think about their move before they do it.2019年6月四级真题(第一套)听力 Section COn Sunday, the castle's owner John Gordon, 76, was forced to move out his property after the river Dee swept away about 60 feet of land, leaving the castle dangerously close to the river, according to the Scottish Daily Record.2016年12月四级真题(第一套)听力 Section AOn the demand side, those trends include the ongoing addition of more than 70 million people a year, a growing number of people wanting to move up the food chain to consume highly grain-intensive meat products, and the massive diversion of U.S. grain to t2016年6月四级真题(第一套)阅读 Section BOnce we're on the path of growth, we can continually move through the seasons of transformation and renewal.2017年6月四级真题(第二套)阅读 Section BSuch a system could, if necessary, move troops quickly from one area to another.2018年6月四级真题(第二套)听力 Section CThe objective of this debating game is not to win but to get to the truth that will allow you to move faster, farther and better.2015年12月四级真题(第二套)阅读 Section CYoung families move here because the schools are great.2019年12月四级真题(第一套)阅读 Section BMorgan said those findings—which included data from the system's 13 community colleges, 27 technical colleges and six universities—were part of the decision not to move forward with Governor Bill Haslam's proposal to privatize management of state buildings in an effort to save money.出自-2017年6月阅读原文Many aristocrats began to move into Roman-style villas.出自-2017年6月阅读原文Macy's has been moving aggressively to try to remake itself for a new era of shopping.出自-2017年6月阅读原文It will slash staffing at its fleet of 770 stores, a move affecting some 3,000 employees.出自-2017年6月阅读原文The government has moved reluctantly into a sensible public health policy, but with such obvious over- cautiousness that any political credit due belongs to the opposition.出自-2016年12月阅读原文So why has it taken so long? The Department of Health declared its intention to consider the move in November 2010 and consulted through 2012.出自-2016年12月阅读原文Chinese officials say the expansion in Antarctica prioritises scientific research, but they also acknowledge that concerns about resource security influence their moves.出自-2016年12月阅读原文Advanced batteries are moving out of specialized markets and creeping into the mainstream, signaling a tipping point for forward-looking technologies such as electric cars and rooftop solar panels.出自-2016年12月阅读原文Currently, there’s mounting criticism of Michelle Obama’s Let’s Move campaign, which fights childhood obesity by encouraging youngsters to become more physically active, and it signed on singer Beyonce and basketball player Shaquille O’Neal, both of whom also endorse sodas which are a major contributor to the obesity epidemic.出自-2016年12月听力原文Unfortunately for them ( ' , and often the taxpayers), our energy systems are a bit like an aircraft carrier: they are unbelievably expensive, they are built to last for a very long time, they have a huge amount of inertia ( ' , meaning it takes a lot of energy to set them moving), and they have a lot of momentum once they are set in motion.出自-2015年12月阅读原文So what factors, at the community level, do predict if poor children will move up the economic ladder as adults? What explains, for instance, why the Salt Lake City metro area is one of the 100 largest metropolitan areas most likely to lift the fortunes of the poor and the Atlanta metro area is one of the least likely?Harvard economist Raj Chetty has pointed to economic and racial segregation, community density, the size of a community's middle class, the quality of schools, community religiosity, and family structure, which he calls the single strongest correlate of upward mobility.出自-2015年12月阅读原文So a heavy object, like a football player moving at a high speed, has a lot of momentum — that is, once be is moving, it is hard to change his state of motion.出自-2015年12月阅读原文Physical characteristics of moving objects help explain the dynamics of energy systems.出自-2015年12月阅读原文Not only moving objects and people but all systems have momentum.出自-2015年12月阅读原文It is better to start from the community to help poor children move up the social ladder.出自-2015年12月阅读原文In physics, moving objects have two characteristics relevant to understanding the dynamics of energy systems: inertia and momentum.出自-2015年12月阅读原文According to the Centre for Strategic and International Studies,about three quarter of energy we use to move things, including ourselves, accomplishes no useful work.出自-2015年12月听力原文Across the developed world, ear use is in decline as more people move to city centers, while young people especially are opting for other means of travel.2019年12月六级真题(第二套)阅读 Section AAndy Holder—the chief economist at The Bank of England—suggested that the UK move towards a government-backed digital currency.2017年6月六级真题(第二套)听力 Section CB2B commerce, for example, didn't move mainly online by 2005 as many had predicted in 2000, nor even by 2016, but that doesn't mean it won't do so over the next few decades.2019年6月六级真题(第一套)阅读 Section BCreating this sanctuary is a bold move that the people of Palau recognize as essential to our survival.2017年12月六级真题(第二套)阅读 Section AGlobally, urban populations are expected to double in the next 40 years, and an extra 2 billion people will need new places to live, as well as services and ways to move around their cities.2019年12月六级真题(第二套)阅读 Section AIt's become so iconic that attempts to change its taste in 1985—sweetening it in a move projected to boost sales—proved disastrous, with widespread anger from consumers.2017年12月六级真题(第一套)阅读 Section CMorgan said those findings—which included data from the system's 13 community colleges, 27 technical colleges and six universities—were part of the decision not to move forward with Governor Bill Haslam's proposal to privatize management of state building2017年6月六级真题(第二套)阅读 Section CRodriguez is just the seventh entrepreneur to move into one of Brookdale's 1, 100 senior living communities.2019年6月六级真题(第一套)阅读 Section Csince it's a government-operated institution, things don't move very fast.2016年6月六级真题(第二套)听力 Section ASo Brookdale, the country's largest owner of retirement communities, has been inviting a few select entrepreneurs just to move in for a few days, show off their products and hear what the residents have to say.2019年6月六级真题(第一套)阅读 Section CSo what factors, at the community level, do predict if poor children will move up the economic ladder as adults?2015年12月六级真题(第三套)阅读 Section CThe chemical composition of rainfall changes slightly as rain clouds move.2015年12月六级真题(第二套)听力 Section CThe Department of Health declared its intention to consider the move in November 2010 and consulted through 2012.2016年12月六级真题(第三套)阅读 Section CThe prospect of having to sell their home and give up their independence, and move into a retirement home was an extremely painful experience for them.2015年12月六级真题(第一套)听力 Section CThree-quarters of the world's flamingos fly over from other salt lakes in the Rift Valley and nest on salt-crystal islands that appear when the water is at a specific level一too high and the birds can't build their nests, too low and predators can move bri2017年12月六级真题(第三套)阅读 Section CWhen that happens, many trees like walnuts, oaks and pines, rely 30 exclusively on so-called "scatter-hoarders, " such as birds, to move their seeds to new localities.2016年12月六级真题(第一套)阅读 Section AAgain, not a move, the next time, I had my camera ready to record what you see here, one of several dozen such pictures, so long as she had a slice to eat, she never bothered the one on her head.2015年高考英语四川卷 完形填空 原文Alia knew that if the books were to be safe, they must be moved again while the city was quiet.2017年高考英语浙江卷(6月) 完形填空 原文An application of the method of moving blocks to the pyramid site.2015年高考英语四川卷 阅读理解 阅读E 选项An argument about different methods of moving blocks to the pyramid site.2015年高考英语四川卷 阅读理解 阅读E 选项An experiment on ways of moving blocks to the pyramid site.2015年高考英语四川卷 阅读理解 阅读E 选项An introduction to a possible new way of moving blocks to the pyramid site.2015年高考英语四川卷 阅读理解 阅读E 选项And if a predator can move on to another species that is easier to find when a prey species becomes rare, the switch allows the original prey to recover.2019年高考英语天津卷 阅读理解 阅读C 原文Animals are built of many different materials----skin, fat, and more----and light moves through each at a different speed.2015年高考英语北京卷 阅读理解 阅读C 原文As a third generation native of Brownsville, Texas, mildred Garza never pleased move away.2016年高考英语全国卷1 阅读理解 阅读B 原文As soon as you get the answer you need, move on to the next person.2017年高考英语浙江卷(6月) 阅读理解 七选五 原文As they left student life behind, many had a last drink at their cheap but friendly local bar, shook hands with longtime roommates, and moved out of small apartments into high buildings.2015年高考英语浙江卷 完形填空 原文As we move away from an industrial-based economy to a knowledge-based one, office designers have come up with alternatives to the traditional work environments of the past.2015年高考英语上海卷 选词填空 原文At the age of 18, he moved to the united states.2019年高考英语全国卷2 听力 原文Before I knew it an hour had passed and it was time to move on to lunch.2018年高考英语全国卷3 阅读理解 阅读D 原文Ben, had got in touch, he'd moved to England with his mum when he was three and it had been 13 years since I'd last seen him.2018年高考英语全国卷2 完形填空 原文But I hope to move the family out there in a couple of months' time.2017年高考英语江苏卷 听力 原文By the time these "solutions" become widely available, scammers will have moved onto cleverer means.2019年高考英语北京卷 阅读理解 阅读C 原文Can quickly move to another place.2019年高考英语天津卷 阅读理解 阅读C 选项Clarity of thoughts can help you move forward.2019年高考英语全国卷2 阅读理解 七选五 原文Determined to be myself, move forward, free of shame and worldly labels, I can now call myself a "marathon winner".2018年高考英语北京卷 阅读理解 阅读A 原文Even more worryingly, the fascination with the Internet by people in rich countries has moved the international community to worry about the "digital divide" between the rich countries and the poor countries.2019年高考英语江苏卷 阅读理解 阅读C 原文Even when her daughter and son asked her to move to san antonio to help their children, she politely refused.2016年高考英语全国卷1 阅读理解 阅读B 原文Every time light moves into a material with a new speed, it bends and scatters.2015年高考英语北京卷 阅读理解 阅读C 原文Finally, you never know what wonderful idea might strike while your mind has moved slowly away.2015年高考英语北京卷 阅读理解 单项填空 原文Getting married is 50, pregnancy 40, moving house 20, Christmas 12, etc.2016年高考英语上海卷 语法填空 B 原文Greg saw, across a field, the dog moving cautiously away.2019年高考英语全国卷2 完形填空 原文He couldn't walk, but he managed to get out of the crevasse and started to move towards their camp, nearly ten kilometers away.2014年高考英语全国卷2 完形填空 原文He had developed some house-moving skills successfully.2015年高考英语湖南卷 阅读理解 阅读B 原文He'd move his fingers clumsily on the piano, and then she'd take his place.2019年高考英语江苏卷 阅读理解 阅读D 原文Her school had moved to Brooklyn.2016年高考英语北京卷 阅读理解 阅读B 选项Hilversum became the media capital of the Netherlands, and Dutch television stars moved into the leafy neighborhoods surrounding the town.2015年高考英语湖北卷 阅读理解 阅读C 原文I grew up in a small town until I was 18 and then moved to a big city, so I have experienced the good and bad sides of both.2014年高考英语全国卷2 听力 原文I helped him move slowly over the fence.2016年高考英语全国卷3 完形填空 原文In addition, their arms that are unnecessary for moving around are freed for other purposes, like throwing stones or signaling.2019年高考英语江苏卷 阅读理解 任务型阅读 原文In order not to be heard, she pointed her finger upwards to signal that someone was moving about upstairs.2015年高考英语湖北卷 单项选择 原文In the first move of its kind, all travelers will be forced to stand on both sides of escalators on the London underground as part of a plan to increase capacity at the height of the rush hour.2016年高考英语上海卷 阅读理解 阅读D 原文It has to continue to move, because the way the world works is not the same, says Moran.2017年高考英语全国卷1 阅读理解 阅读C 原文It's widely believed that the stone blocks were moved to the pyramid site by sliding them on smooth paths.2015年高考英语四川卷 阅读理解 阅读E 题设Jane moved aimlessly down the tree-lined street, not knowing where she was heading.2017年高考英语北京卷 单项填空 原文Just make an apology, and move on.2015年高考英语福建卷 短文填词 原文Larry told her that he had already put out the fire and she should not move in case she injured her neck.2016年高考英语全国卷1 完形填空 原文Move more slowly in deep water.2015年高考英语北京卷 阅读理解 阅读C 选项Move on to the next person if someone tells you she is not interested.2017年高考英语浙江卷(6月) 阅读理解 七选五 原文Moving into a new home in a new neighborhood is an exciting experience.2018年高考英语浙江卷 阅读理解 七选五 原文No statistics show the number of grandparents like garza who are moving closer to the children and grandchildren.2016年高考英语全国卷1 阅读理解 阅读B 原文Now, several states are moving to tighten laws by adding new regulations for opting out.2017年高考英语北京卷 阅读理解 阅读C 原文Of course! I forgot you and jenny are moving into a new house.2019年高考英语全国卷2 听力 原文Office designers' response to this change has been to move open-plan areas to more desirable locations within the office and crate fewer formal private offices.2015年高考英语上海卷 选词填空 原文On every single move you have to analyze a situation, process what your opponent is doing and evaluate the best move from among all your options.2018年高考英语全国卷I 完形填空 原文Once when she was facing away, I reached out and carefully scratched her back with my finger, she didn't move.2015年高考英语四川卷 完形填空 原文One of the families moving in was the brenninkmeijers, currently the wealthiest family of the netherlands.2015年高考英语湖北卷 阅读理解 阅读C 原文People have long puzzled over how the Egyptians moved such huge rocks.2015年高考英语四川卷 阅读理解 阅读E 原文She calculated that going to a stranger's house was a risky move, but she decided to take the chance.2019年高考英语天津卷 完形填空 原文She had asked the government for permission to move the books to a safe place, but they refused.2017年高考英语浙江卷(6月) 完形填空 原文So I applied successfully for the training program at the school of toronto dance theatre, and moved to Toronto to attend the program.2018年高考英语全国卷2 听力 原文So if moving the body can have these effects, what about the clothes we wear?2017年高考英语浙江卷(11月) 阅读理解 阅读B 原文Solving the safety problem well enough to move forward in AI seems to be possible but not easy.2017年高考英语北京卷 阅读理解 阅读D 原文Steve and Naomi spoke in musical code lines, beats, intervals, moving from the root to end a song in a new key.2019年高考英语江苏卷 阅读理解 阅读D 原文Steve moved to the piano and sat at the bench, hands trembling as he gently placed his fingers on the keys.2019年高考英语江苏卷 阅读理解 阅读D 原文Surveys 调查 on this topic suggests that parents today continue to be "very" or "somewhat" overly-protective even after their children move into college dormitories.2015年高考英语北京卷 阅读理解 阅读D 原文The battle lasts little more than half an hour, in which time around 50, 000 kilograms of tomatoes have been thrown at anyone or anything that moves, runs, or fights back.2015年高考英语福建卷 阅读理解 阅读A 原文The coming technological advancement presents a chance for cities and states to develop transportation systems designed to move more people, and more affordably.2018年高考英语北京卷 阅读理解 阅读D 原文The design industry has moved away from a fixed offices setup and created more flexible "strategic management environments".2015年高考英语上海卷 选词填空 原文The Egyptians somehow moved the stone blocks to the pyramid site from about one kilometer away.2015年高考英语四川卷 阅读理解 阅读E 原文The first is that antitrust authorities need to move form the industrial age into the 21st century.2017年高考英语江苏卷 阅读理解 阅读C 原文The move, imitating a similar structure in far eastern cities such as Hong Kong, is designed to increase the number of people using long escalators at the busiest times.2016年高考英语上海卷 阅读理解 阅读D 原文The sense of excitement and tension levels rise suddenly though, as does your heart rate, as you move closer to them.2015年高考英语重庆卷 阅读理解 阅读D 原文The Stroudwater Canal is moving towards reopening.2015年高考英语全国卷1 阅读理解 阅读A 原文The tasters move down the line with surprising speed, tasting from a spoon and deciding what is a fair price for each tea.2015年高考英语全国卷2 听力 原文The two didn't know each other well—Taylor had just moved to town a month or so before.2017年高考英语北京卷 阅读理解 阅读A 原文There I sat, considering my next move.2015年高考英语四川卷 阅读表达 原文They calculated that rolling the block required about as much force as moving it along a slippery path.2015年高考英语四川卷 阅读理解 阅读E 原文They moved in after big success in the textile industry and aided a substantial textile industry in Hilversum.2015年高考英语湖北卷 阅读理解 阅读C 原文They moved their family to San Francisco.2015年高考英语安徽卷 阅读理解 阅读B 原文This is when you start to move away from your family and into the bigger world.2016年高考英语北京卷 阅读理解 阅读E 原文To do CPR, you press on the sick person's chest so that blood moves through the body and takes oxygen to organs.2017年高考英语北京卷 阅读理解 阅读A 原文Today all three generations regard the move to a success, giving them a closer relationship than they would have had in separate cities.2016年高考英语全国卷1 阅读理解 阅读B 原文We all assumed there would be one in the flat when we moved in, because that's what we read from the advertisement in the newspaper.2017年高考英语浙江卷(11月) 听力 原文We haven't had any guests since we moved in here.2016年高考英语全国卷2 听力 原文When I was a little girl, my family moved to a tiny town at the bottom of a big mountain.2018年高考英语天津卷 阅读理解 阅读表达 原文Whenever you move to a new area, you should locate the fire alarm pull stations and the two exits nearest your room.2018年高考英语天津卷 阅读理解 阅读A 原文You just focus on the move.2019年高考英语全国卷2 听力 原文Later, move established companies raced to add such patents to their files, if only as a defensive move against rivals that might bent them to the punch.出自-2010年考研阅读原文In a move that has intellectual-property lawyers abuzz, the U.出自-2010年考研阅读原文As boards scrutinize succession plans in response to shareholder pressure, executives who don’t get the nod also may wish to move on.出自-2011年考研阅读原文Yet for the most part, the animal kingdom moves through the world downloading.出自-2012年考研阅读原文It’s a stunning move.出自-2012年考研阅读原文Downloading and consuming culture requires great skills, but failing to move beyond downloading is to strip oneself of a defining constituent of humanity.出自-2012年考研阅读原文Beethoven’s music tends to move from chaos to order as if order were an imperative of human existence.出自-2014年考研翻译原文The move turned out to be foresighted.出自-2016年考研阅读原文For someone moving from finance to advertising, maybe they want to look more “SoHo”.出自-2016年考研阅读原文The Navy Department moved into the east wing in 1879, where elaborate wall and ceiling stenciling and marquetry floors decorated the office of the Secretary.出自-2018年考研阅读原文Legislation is moving through the House that would save USPS an estimated $286 billion over five years, which could help pay for new vehicles, among other survival measures.出自-2018年考研阅读原文As boards scrutinize succession plans in response to shareholder pressure, executives who don't get the nod also may wish to move on.2011年考研真题(英语一)阅读理解 Section ⅡFurthermore, these losses make us mature and eventually move us toward future opportunities for growth and happiness.2015年考研真题(英语二)阅读理解 Section Ⅱgiven the advantages of electronic money, you might think that we would move quickly to the cashless society in which all payments are made electronically.2013年考研真题(英语二)完形填空 Section ⅠHere are five simple ways that you can make the first move and start a conversation with strangers.2018年考研真题(英语二)阅读理解 Section ⅡIf the district finds homework to be unimportant to its students'academic achievement, it should move to reduce or eliminate the assignments, not make them count for almost nothing.2012年考研真题(英语二)阅读理解 Section ⅡIn Britain the move towards open access publishing has been driven by funding bodies.2020年考研真题(英语一)阅读理解 Section ⅡLater, more established companies raced to add such patents to their files, if only as a defensive move against rivals that might beat them to the punch.2010年考研真题(英语一)阅读理解 Section ⅡSuch a move could affect firms such as McDonald's, which sponsors the youth coaching scheme run by the Football Association.2011年考研真题(英语二)阅读理解 Section ⅡThe French tax is not just a unilateral move by one country in need of revenue.2020年考研真题(英语一)阅读理解 Section ⅡThe move to renewables is picking up momentum around the world: They now account for more than half of new power sources going on line.2018年考研真题(英语二)阅读理解 Section ⅡThe robots rats were quite minimalist, resembling a chunkier version of a computer mouse with wheels-to move around and colorful markings.2020年考研真题(英语二)阅读理解 Section ⅡWhat we need to do is find a way to acknowledge and express what we feel appropriately, and then -- again, like children -- move on.2016年考研真题(英语二)阅读理解 Section ⅡWhen you start conversation from there and then move outwards, you'll find all of a sudden that the conversation becomes a lot easier.2018年考研真题(英语二)阅读理解 Section ⅡYet humans remain fascinated by the idea of robots that would look, move, and respond like humans, similar to those recently depicted on popular sci-fi TV series such as "Westworld" and "Humans".2020年考研真题(英语一)翻译 Section Ⅲ收起真题例句英英释义Noun1. the act of deciding to do something;"he didn't make a move to help""his first move was to hire a lawyer"2. the act of changing your residence or place of business;"they say that three moves equal one fire"3. a change of position that does not entail a change of location;"the reflex motion of his eyebrows revealed his surprise""movement is a sign of life""an impatient move of his hand""gastrointestinal motility"4. the act of changing location from one place to another;"police controlled the motion of the crowd""the movement of people from the farms to the cities""his move put him directly in my path"5. (game) a player's turn to move a piece or take some other permitted actionVerb1. change location; move, travel, or proceed;"How fast does your new car go?""We travelled from Rome to Naples by bus""The policemen went from door to door looking for the suspect""The soldiers moved towards the city in an attempt to take it before night fell"2. cause to move, both in a concrete and in an abstract sense;"Move those boxes into the corner, please""I'm moving my money to another bank""The director moved more responsibilities onto his new assistant"3. move so as to change position, perform a nontranslational motion;"He moved his hand slightly to the right"4. change residence, affiliation, or place of employment;"We moved from Idaho to Nebraska""The basketball player moved from one team to another"5. follow a procedure or take a course;"We should go farther in this matter""She went through a lot of trouble""go about the world in a certain manner""Messages must go through diplomatic channels"6. be in a state of action;"she is always moving"7. go or proceed from one point to another;"the debate moved from family values to the economy"8. perform an action, or work out or perform (an action);"think before you act""We must move quickly""The governor should act on the new energy bill""The nanny acted quickly by grabbing the toddler and covering him with a wet towel"9. have an emotional or cognitive impact upon;"This child impressed me as unusually mature""This behavior struck me as odd"10. give an incentive for action;"This moved me to sacrifice my career"11. arouse sympathy or compassion in;"Her fate moved us all"12. dispose of by selling;"The chairman of the company told the salesmen to move the computers"13. progress by being changed;"The speech has to go through several more drafts""run through your presentation before the meeting"14. live one's life in a specified environment;"she moves in certain circles only"15. have a turn; make one's move in a game;"Can I go now?"16. propose formally; in a debate or parliamentary meeting收起英英释义词根词缀词根: mov=move,表示"运动"n.moment 片刻;瞬间mo=mov运动+ment表名词→时间移走n.&v.move 移动, 迁居, 步骤mov运动+e→n.&v.移动, 迁居, 步骤词组搭配move inTo begin to occupy a residence or place of business.搬进:开始占据一个住宅地或商业场所get a move on[often in imperative](informal)hurry up(非正式)快些,赶紧get moving[often in imperative](informal)make a prompt start (on a journey or task)(非正式)赶快;快些开始you're here to work, so get moving.你来这儿是干活的,那就快干。make a movetake action采取行动each army was waiting for the other side to make a move.双方军队都在等对方先动手。make a move on (或 put the moves on)(informal)make a proposition to (someone), especially of a sexual nature(非正式)向(某人)提出想法(尤指性要求)move the goalpostsmove heaven and earthmove mountainsmove up a gearmove with the timeskeep abreast of current thinking or developments与时俱进not move a musclemove along[often in imperative]change to a new position, especially to avoid causing an obstruction(尤指为避免拥堵而)向前走,继续前进‘Move along, move along,’ said the constable.警官说:“往前走,别停。”。move aside‘Move along, move along,’ said the constable.警官说:“往前走,别停。”。move on (或 move someone on)go or cause to leave somewhere, especially because one is causing an obstruction(要求…)走开,(要求…)不要停留the Mounties briskly ordered them to move on.加拿大骑警不客气地命令他们走开。收起词组搭配同义词辨析motion, move, movement这些名词都有"运动"之意。motion: 指不处于静止状态而在移动的过程中,强调运动本身,而不涉及其动因。move: 着重开始的行动或变化。movement: 通常抽象地指有规则的动作或定向运动,特指政治性的运动。move, shift, transfer, remove这些动词均可表示"从一处移往另一处"之意。move: 普通用词,指从一处到另一外的任何距离的转移。shift: 侧重位置与方向的改变。transfer: 一般表示转送或移交迁移,尤指交通运输中的换乘或职务的调动等。remove: 作"移动"解时,与move可换用,还可指撤职或开除学藉等。touch, inspire, move这些动词均有"感动,打动"之意。touch: 主要用于表示怜悯或同情等场合,侧重感动。inspire: 指激起勇气和信心,侧重鼓励,有时含"启发灵感"之意。move与touch可换用,但语气强一些,运用范围广些。同义词vt.影响;感动;说服promptinfluenceaffectpersuadeconvinceinduceswayarousevt.搬动;推动shakepullthrowtakesendliftcarryputpushvt.移动;催促;变化stimulatemotivateimpelchangestiranimatebudge其他释义touchweightpasskindlepropositionforwardstirdriveridemigratearouseflutterforwardssoftenchangepropelrunsweepcommutewavepromptimpelaccomplishmentinfluencecreepenlistanimateprickstimulatetravelpersuadeleverrousemovementrollgoexciteproposeconvinceinflameheataffectbudgeswayinduceprevailtransmissionormotivatewheel反义词vt.开动stop其他释义stopstay行业词典体育着法   走法   走子   法律提议   常用俚语put a move on(向女性)勾引,调情,求欢He stopped everything to put a move on that Russian woman.他把手头的事情都放下来,去向那个俄国女人调情。释义词态变化实用场景例句真题例句英英释义词根词缀词组搭配同义词辨析同义词反义词行业词典常

MOVE中文(简体)翻译:剑桥词典

MOVE中文(简体)翻译:剑桥词典

词典

翻译

语法

同义词词典

+Plus

剑桥词典+Plus

Shop

剑桥词典+Plus

我的主页

+Plus 帮助

退出

剑桥词典+Plus

我的主页

+Plus 帮助

退出

登录

/

注册

中文 (简体)

查找

查找

英语-中文(简体)

move 在英语-中文(简体)词典中的翻译

moveverb uk

Your browser doesn't support HTML5 audio

/muːv/ us

Your browser doesn't support HTML5 audio

/muːv/

move verb

(CHANGE POSITION)

Add to word list

Add to word list

A2 [ I or T ] to (cause to) change position

(使)改变位置,动;(使)移动

I'm so cold I can't move my fingers.

我太冷了,手指都动不了了。

Will you help me move this table to the back room?

你能帮我把这张桌子搬到后面的房间里吗?

Can we move (= change the time of) the meeting from 2 p.m. to 3.30 p.m. ?

我们能将会议时间由下午两点改到三点半吗?

Don't move! Stay right where you are.

别动!就呆在那儿。

I thought I could hear someone moving about/around upstairs.

我好像听到楼上有人走动。

If you move along/over/up (= go further to the side, back, or front) a little, Tess can sit next to me.

如果你往边上/往后/往前挪一点儿,特丝就能坐在我旁边了。

Police officers at the scene of the accident were asking people to move along/on (= to go to a different place).

事故现场的警官让路人走开。

Come on, it's time we were moving (= time for us to leave).

快点,我们该走了。

Let's stay here tonight, then move on (= continue our journey) tomorrow morning.

我们今晚住这儿吧,明早再继续赶路。

[ I or T ] to change the position of one of the pieces used in a board game

(棋盘游戏中)走棋,走子,(棋子)被移动

In chess, the pieces can only move in certain directions.

下棋必须按棋规所定的方向走子。

更多范例减少例句You can move the cursor either by using the mouse or by using the arrow keys on the keyboard.I didn't want to move in case I woke her up.In the summer, the shepherds move their sheep up into the hills .Could I possibly ask you to move your chair a little?The poor things were kept in small cages without room to move.

move verb

(CHANGE PLACE)

B1 [ I ] to go to a different place to live or work

搬家;搬迁;迁移

We're moving to Paris.

我们要搬到巴黎去了。

They've bought a new house, but it will need a lot of work before they can move into it/move in.

他们买了套新房子,但搬进去之前还有许多工作要做。

I hear Paula has moved in with her boyfriend (= gone to live in his house).

我听说葆拉搬去和她男朋友住了。

The couple next door moved away (= went to live somewhere else) last year.

隔壁的那对夫妇去年搬走了。

A lot of businesses are moving out of London because it's too expensive.

许多企业因为费用太高而迁出了伦敦。

 move house B1 UK

to leave your home in order to live in a new one

搬家

We're moving house next week.

我们下周要搬家。

更多范例减少例句When we retire, we're going to move to a warmer climate .We would dearly love to sell our flat and move to the country.They decided to move abroad and make a fresh start.Now that the children are settled at school , we don't really want to move again.After nine years in Cambridge, Susannah and Guy moved to Watlington, where they lived happily ever after.

move verb

(PROGRESS)

[ I or T ] to (cause to) progress, change, or happen in a particular way or direction

(使)进展;(使)发展

The judge's decision will allow the case to move forward.

法官的决定将使诉讼得以继续进行。

If you want to move ahead in your career, you'll have to work harder.

如果你想在事业上有所发展,就必须更努力地工作。

Share prices moved up/down slowly yesterday.

昨天股价缓慢上涨/下跌。

Sophie has been moved up/down a grade at school.

索菲在学校里跳/留了一级。

It's time this company moved into (= started to take advantage of the benefits of) the digital age.

这家公司该实行数字化了。

更多范例减少例句I don't really like working on a computer, but you have to move with the times, I suppose.Traffic moved forward at a crawl.The company has moved into plastics.The procession moved through the streets at a steady pace.By lap 26, Hamilton had moved into second position.

move verb

(CAUSE)

[ T ] to cause someone to take action

促使,驱使

[ + obj + to infinitive ] formal I can't imagine what could have moved him to say such a thing.

我想象不出是什么促使他说了这种话。

move verb

(CHANGE OPINION)

[ I or T ] to (cause to) change an opinion or the way in which you live or work

(使)改变观点(或做法)

He's made up his mind, and nothing you can say will move him on the issue.

他决心已定,你说什么也不能改变他对这件事的看法。

More and more people are movingaway from/towards vegetarianism.

越来越多的人不再是/正成为素食主义者。

move verb

(FEELINGS)

B2 [ T ] to cause someone to have strong feelings, such as sadness, sympathy, happiness, or admiration

感动;引起,激起(情感)

She said that she was deeply moved by all the letters of sympathy she had received.

她说她被收到的所有慰问信深深打动了。

It was such a sad film that it moved him to tears (= made him cry).

这部电影十分伤感,令他落泪。

move verb

(SELL)

[ I or T ] informal to sell

卖掉,使脱手

No one wants to buy these toys - we just can't move them.

没人想买这些玩具——根本就卖不出去。

This new shampoo is moving really fast.

这种新洗发水销得很快。

move verb

(BE WITH PEOPLE)

[ I + adv/prep ] to spend time with people

进行社交活动;交往

She moves in/among a very small circle of people.

她的社交圈子很小。

move verb

(SUGGEST)

[ I or T ]

  politics, law

  specialized to suggest something, especially formally at a meeting or in a law court

(在会议上)提出;提议;(向法庭)提出请求,申请

A vote was just about to be taken when someone stood up and said that they wished to move an amendment.

正要开始表决,有人站起来说他们想提出修正案。

[ + that ] I move that the proposal be accepted.

我提议接受这项建议。

Your Honour, we wish to move for dismissal of the charges.

尊敬的法官大人,我们请求驳回这些指控。

move verb

(PASS)

[ I or T ] polite word (used especially by doctors and nurses) to pass the contents of the bowels out of the body

(尤为医护人员用语)(使)(肠道)排泄粪便

The doctor asked him if he'd moved his bowels that day.

医生问他那天是否排过便。

习语

move heaven and earth

move it!

move on to bigger/better things

move with the times

not move a muscle短语动词

move someone/something in

move in on something/someone

move off something/on (to something)

move on

move out

movenoun uk

Your browser doesn't support HTML5 audio

/muːv/ us

Your browser doesn't support HTML5 audio

/muːv/

move noun

(CHANGE OF POSITION)

C2 [ S ] an act of moving

动;动作;移动

She held the gun to his head and said, "One move and you're dead!"

她拿着枪对着他的头,说:“动一下你就没命了。”

I hate the way my boss watches my every move (= watches everything I do).

我讨厌老板总是监视我的一举一动。

[ C ] in some board games, a change of the position of one of the pieces used to play the game, or a change of position that is allowed by the rules, or a player's turn to move their piece

一步棋;(按规则)棋的可走方法

It takes a long time to learn all the moves in chess.

要学会棋的各种走法需要花很长时间。

It's your move.

该你走棋了。

更多范例减少例句She sat back for a minute to ponder her next move in the game.My cactus seems to be benefiting from its move from the living room to the kitchen windowsill.The cattle have had a move from the top field down into the meadow, I see."Where have the reference books gone?" "Oh - they've had a move. They're by the door now."Agassi's move to the net was perfectly timed, and he is rewarded with two match points.

move noun

(CHANGE OF PLACE)

C1 [ C ] an occasion when you go to live or work in a different place

搬家;迁移

We've had four moves in three years.

我们3年里搬了4次家。

更多范例减少例句They helped us with our move to Norwich.We have had three office moves in five years.The move to Scotland was a big wrench for the children.The film follows one family's move to Spain.

move noun

(ACTION)

C1 [ C ] an action taken to achieve something

行动;步骤;措施

Buying those shares was a good move.

买那些股票是明智之举。

This move towards improving childcare facilities has been widely welcomed.

这项改善保育设施的措施受到广泛欢迎。

[ + to infinitive ] The city council is making a move to improve traffic flow in the city.

市议会正采取措施改善市区交通状况。

 make the first move

to be the first to take action

率先行动

Neither side seems prepared to make the first move towards reaching a peace agreement.

双方似乎都不愿为达成和平协议而率先迈出一步。

informal to start a romantic or sexual relationship with someone

(对某人)主动展开追求

She's liked him for a long time, but doesn't want to make the first move.

她喜欢他很长时间了,但不想主动追求他。

更多范例减少例句It was a shrewd move to buy your house just before property prices started to rise.Quitting that job was the smartest move I ever made.The newspaper made the bold move of publishing the names of the men involved."The children are getting rather bored, so shall we take them to the park?" "Yes, I think that would be a good move."It was a brave move to stand up and question the boss's figures, but you certainly made him notice you!

习语

be on the move

get a move on

make a move

(move在剑桥英语-中文(简体)词典的翻译 © Cambridge University Press)

move的例句

move

Older infants may be more likely to have moved around to different foster homes and thus to have suffered more disruptions than younger infants.

来自 Cambridge English Corpus

This possibility was tested by asking the subjects to move fingers on a virtual hand presented to them on a computer screen.

来自 Cambridge English Corpus

The manipulator remains standing still, until the operator begins to move it.

来自 Cambridge English Corpus

Subsequent scenes show teeming streets, construction sites, moving trains, and the bustling harbor.

来自 Cambridge English Corpus

Hence, it is difficult to explain why players would conceive of the simultaneous move game in sequential terms.

来自 Cambridge English Corpus

The remaining fourteen had moved into private enterprise, mostly with firms specializing in the field of their former ministries.

来自 Cambridge English Corpus

He moves beyond aesthetic analysis to relate these themes to the broader historical context.

来自 Cambridge English Corpus

A small test flash was first used to center the stimulus over the receptive field by manually moving it to elicit a maximum response.

来自 Cambridge English Corpus

示例中的观点不代表剑桥词典编辑、剑桥大学出版社和其许可证颁发者的观点。

A2,B1,B1,B2,C2,C1,C1

move的翻译

中文(繁体)

改變位置, (使)改變位置,動, (使)移動…

查看更多内容

西班牙语

mover, moverse, jugar…

查看更多内容

葡萄牙语

mover, mover-se, mexer…

查看更多内容

更多语言

in Marathi

日语

土耳其语

法语

加泰罗尼亚语

in Dutch

in Tamil

in Hindi

in Gujarati

丹麦语

in Swedish

马来语

德语

挪威语

in Urdu

in Ukrainian

俄语

in Telugu

阿拉伯语

in Bengali

捷克语

印尼语

泰语

越南语

波兰语

韩语

意大利语

हलणे, हलवणे, राहण्यास जाणे…

查看更多内容

(物)が動く, (物)を動かす, (人)が引っ越す…

查看更多内容

taşınmak, yer değiş(tir)mek, hareket et(tir)mek…

查看更多内容

bouger, déplacer, évoluer…

查看更多内容

moure(‘s), traslladar-se, emocionar…

查看更多内容

bewegen, verplaatsen, verhuizen…

查看更多内容

நிலையை மாற்றுவதற்கு (காரணமாக)., வாழ அல்லது வேலை செய்ய வேறு இடத்திற்குச் செல்ல, சோகம்…

查看更多内容

हिलना, स्तिथि बदलना या में बदलाव लाना, (रहने या काम के लिए) स्थान-परिवर्तन करना…

查看更多内容

ખસેડવું, હલવું, બીજી જગ્યાએ રહેવા કે કામ કરવા સ્થળાંતર કરવું…

查看更多内容

bevæge, flytte, træk…

查看更多内容

röra [på], flytta [på], flytta…

查看更多内容

alihkan, berpindah, mempengaruhi perasaan…

查看更多内容

(fort-)bewegen, umziehen, ergreifen…

查看更多内容

flytte, flytte på seg, bevege seg…

查看更多内容

جنبش دینا, آگے بڑھنا, ہلنا…

查看更多内容

рухати(ся), пересувати(ся), переїжджати…

查看更多内容

переезжать, двигать(ся), передвигать(ся)…

查看更多内容

స్థానాన్ని మార్చడం కొరకు, నివసించడానికి లేదా పని చేయడానికి వేరే ప్రదేశానికి వెళ్ళు, కదిలించు…

查看更多内容

يَنْقِل, يَتَحَرَّك, يَتَأثَّر…

查看更多内容

সরানো, অবস্থান পরিবর্তন করা, চলে যাওয়া…

查看更多内容

pohnout, hýbat, stěhovat se…

查看更多内容

menggerakkan, pindah, mempengaruhi perasaan…

查看更多内容

เคลื่อน, ย้ายที่อยู่, (ความรู้สึก…

查看更多内容

di chuyển, chuyển nhà, xúc động…

查看更多内容

przeprowadzać się, przenosić się, wyprowadzać się…

查看更多内容

이동하다, 이사하다, 감동시키다…

查看更多内容

muovere, muoversi, spostare…

查看更多内容

需要一个翻译器吗?

获得快速、免费的翻译!

翻译器工具

move的发音是什么?

在英语词典中查看 move 的释义

浏览

mouthwatering

mouthy

movable

movable feast

move

move heaven and earth idiom

move in on something/someone

move it! idiom

move off something/on (to something)

move更多的中文(简体)翻译

全部

false move

move on

move out

move someone/something in

move off something/on (to something)

move in on something/someone

move it! idiom

查看全部意思»

词组动词

move on

move out

move someone/something in

move off something/on (to something)

move in on something/someone

查看全部动词词组意思»

惯用语

move it! idiom

(your) every move idiom

make a move idiom

move/shift your arse! idiom

get a move on idiom

step/move up a gear idiom

move the goalposts idiom

查看全部惯用语意思»

“每日一词”

healthspan

UK

Your browser doesn't support HTML5 audio

/ˈhelθ.spæn/

US

Your browser doesn't support HTML5 audio

/ˈhelθ.spæn/

the number of years that someone lives or can expect to live in reasonably good health

关于这个

博客

Forget doing it or forget to do it? Avoiding common mistakes with verb patterns (2)

March 06, 2024

查看更多

新词

stochastic parrot

March 04, 2024

查看更多

已添加至 list

回到页面顶端

内容

英语-中文(简体)例句翻译

©剑桥大学出版社与评估2024

学习

学习

学习

新词

帮助

纸质书出版

Word of the Year 2021

Word of the Year 2022

Word of the Year 2023

开发

开发

开发

词典API

双击查看

搜索Widgets

执照数据

关于

关于

关于

无障碍阅读

剑桥英语教学

剑桥大学出版社与评估

授权管理

Cookies与隐私保护

语料库

使用条款

京ICP备14002226号-2

©剑桥大学出版社与评估2024

剑桥词典+Plus

我的主页

+Plus 帮助

退出

词典

定义

清晰解释自然的书面和口头英语

英语

学习词典

基础英式英语

基础美式英语

翻译

点击箭头改变翻译方向。

双语词典

英语-中文(简体)

Chinese (Simplified)–English

英语-中文(繁体)

Chinese (Traditional)–English

英语-荷兰语

荷兰语-英语

英语-法语

法语-英语

英语-德语

德语-英语

英语-印尼语

印尼语-英语

英语-意大利语

意大利语-英语

英语-日语

日语-英语

英语-挪威语

挪威语-英语

英语-波兰语

波兰语-英语

英语-葡萄牙语

葡萄牙语-英语

英语-西班牙语

西班牙语-英语

English–Swedish

Swedish–English

半双语词典

英语-阿拉伯语

英语-孟加拉语

英语-加泰罗尼亚语

英语-捷克语

英语-丹麦语

English–Gujarati

英语-印地语

英语-韩语

英语-马来语

英语-马拉地语

英语-俄语

English–Tamil

English–Telugu

英语-泰语

英语-土耳其语

英语-乌克兰语

English–Urdu

英语-越南语

翻译

语法

同义词词典

Pronunciation

剑桥词典+Plus

Shop

剑桥词典+Plus

我的主页

+Plus 帮助

退出

登录 /

注册

中文 (简体)  

Change

English (UK)

English (US)

Español

Русский

Português

Deutsch

Français

Italiano

中文 (简体)

正體中文 (繁體)

Polski

한국어

Türkçe

日本語

Tiếng Việt

हिंदी

தமிழ்

తెలుగు

关注我们

选择一本词典

最近的词和建议

定义

清晰解释自然的书面和口头英语

英语

学习词典

基础英式英语

基础美式英语

语法与同义词词典

对自然书面和口头英语用法的解释

英语语法

同义词词典

Pronunciation

British and American pronunciations with audio

English Pronunciation

翻译

点击箭头改变翻译方向。

双语词典

英语-中文(简体)

Chinese (Simplified)–English

英语-中文(繁体)

Chinese (Traditional)–English

英语-荷兰语

荷兰语-英语

英语-法语

法语-英语

英语-德语

德语-英语

英语-印尼语

印尼语-英语

英语-意大利语

意大利语-英语

英语-日语

日语-英语

英语-挪威语

挪威语-英语

英语-波兰语

波兰语-英语

英语-葡萄牙语

葡萄牙语-英语

英语-西班牙语

西班牙语-英语

English–Swedish

Swedish–English

半双语词典

英语-阿拉伯语

英语-孟加拉语

英语-加泰罗尼亚语

英语-捷克语

英语-丹麦语

English–Gujarati

英语-印地语

英语-韩语

英语-马来语

英语-马拉地语

英语-俄语

English–Tamil

English–Telugu

英语-泰语

英语-土耳其语

英语-乌克兰语

English–Urdu

英语-越南语

词典+Plus

词汇表

选择语言

中文 (简体)  

English (UK)

English (US)

Español

Русский

Português

Deutsch

Français

Italiano

正體中文 (繁體)

Polski

한국어

Türkçe

日本語

Tiếng Việt

हिंदी

தமிழ்

తెలుగు

内容

英语-中文(简体) 

 

Verb 

move (CHANGE POSITION)

move (CHANGE PLACE)

move house

move (PROGRESS)

move (CAUSE)

move (CHANGE OPINION)

move (FEELINGS)

move (SELL)

move (BE WITH PEOPLE)

move (SUGGEST)

move (PASS)

Noun 

move (CHANGE OF POSITION)

move (CHANGE OF PLACE)

move (ACTION)

make the first move

例句

Translations

语法

所有翻译

我的词汇表

把move添加到下面的一个词汇表中,或者创建一个新词汇表。

更多词汇表

前往词汇表

对该例句有想法吗?

例句中的单词与输入词条不匹配。

该例句含有令人反感的内容。

取消

提交

例句中的单词与输入词条不匹配。

该例句含有令人反感的内容。

取消

提交

c++ move函数到底是什么意思? - 知乎

c++ move函数到底是什么意思? - 知乎首页知乎知学堂发现等你来答​切换模式登录/注册编程C++C++ 标准库c++ move函数到底是什么意思?[图片] 被move调用过的变量不是不能使用了吗? 为什么能move两次 甚至还能输出? 后来我新建一个变量str 用sr初始化 s还能用显示全部 ​关注者278被浏览289,986关注问题​写回答​邀请回答​好问题 13​添加评论​分享​47 个回答默认排序SuperSodaSea​C++话题下的优秀答主​ 关注谢邀。std::move 并不会真正地移动对象,真正的移动操作是在移动构造函数、移动赋值函数等完成的,std::move 只是将参数转换为右值引用而已(相当于一个 static_cast)。回到题主的问题上来,在代码std::string str = "test";

string&& r = std::move(str);

中,其实只是定义了一个指向 str 的右值引用而已,str 并没有被移走。随后执行std::string t(r);

,需要注意的是右值引用用于表达式中时会变为左值,所以这里调用的其实是复制构造函数,str 自然也不会被移走。如果要移走的话还要加一次 std::move,比如std::string t(std::move(r));

str 就能被移走了。编辑于 2017-08-21 11:11​赞同 181​​18 条评论​分享​收藏​喜欢收起​暮无井见铃​C++话题下的优秀答主​ 关注假设T - 适合移动语义的类型lv - T 类型左值rv - T 类型右值xlv1 - T 类型临时对象,本属于亡值,但因通过引用访问而属于左值xlv2 - T 类型左值,但希望立即移交其所管理的资源……(其他情况)f - 有专门接受 T&& 参数重载,也有专门接受左值参数重载的函数fr - 只接受 T&& 参数的函数g - 接受 const T& 或 T 参数,不使用移动语义的函数。则 f(lv) 选择左值版本重载, f(rv) 选择右值版本(“移动”)重载,此时不需要 std::move 。对于 fr ,则是正常写 fr(rv) 就行。但 xlv1, xlv2 等形式上是左值表达式,要把它用 static_cast() 转换成右值引用,以匹配 f 的移动重载或 fr 。 std::move 就是封装的 static_cast() ,虽然这个名字单独看来很烂。// 可能的实现, C++14 起

// 返回类型这么写是为了避免转发引用,即保持左值引用不变

template

constexpr remove_reference_t&&

move(T&& t) noexcept

{

return static_cast&&>(t);

}

写 f(std::move(xlv1)) 就是使用移动重载,写 f(xlv1) 就是使用非移动重载;此时勉强可以认为 move 这个名字的意思是提供一个组合的函数名。注意 std::move 只影响调用函数的选择,它本身不需要任何生成机器码。所以对于绑定引用,或传递给 g 这种函数, std::move 是没有影响的。另外在正确实现移动语义的前提下,被移动后的对象在一个“合法而未指定”的状态,仍能通过后续操作获得确定值。虽然一般不需要这么做。编辑于 2017-08-21 12:46​赞同 20​​1 条评论​分享​收藏​喜欢

move是什么意思_move怎么读_move翻译_用法_发音_词组_同反义词_移动_搬动-新东方在线英语词典

move是什么意思_move怎么读_move翻译_用法_发音_词组_同反义词_移动_搬动-新东方在线英语词典

英语词典 -

日语词典

首页 > 英语词典 > 字母单词表 > m开头的单词 > move

move

听听怎么读

英 [mu:v]

美 [muv]

是什么意思

vt.& vi.移动,搬动;vi.搬家;行动;进展;(机器等)开动vt.提议;使感动;摇动;变化n.改变;迁移;

变形

复数:moves过去式:moved过去分词:moved现在分词:moving第三人称单数:moves

双语释义

v.(动词)vt. & vi. 移动; 搬动 change place or positionvi. 搬家,迁移 change place by movingvi. 进展,前进,展开 advance; get nearer to an endvt. 使感动 cause (a person) to feel pity, sadness, anger, admiration, etc.vt. 提议,要求 make at a meeting (a formal suggestion on which arguments for and against are beard, and a decision taken, especially by voting)n.(名词)[S]动,移动,动作 an act of moving, movement[C]一步,一着 an act of taking a piece from one square and putting it on another[C]行动,行动步骤 sth (to be) done to achieve a purpose[C]迁移,搬家 an act of going to a new home, office, etc.

英英释义

moven.the act of deciding to do something"he didn't make a move to help"; "his first move was to hire a lawyer"the act of changing your residence or place of business"they say that three moves equal one fire"同义词:relocationa change of position that does not entail a change of location"movement is a sign of life"; "an impatient move of his hand"同义词:motionmovementmotilitythe act of changing location from one place to another"the movement of people from the farms to the cities"; "his move put him directly in my path"同义词:motionmovement(game) a player's turn to take some action permitted by the rules of the gamev.change location; move, travel, or proceed"The soldiers moved towards the city in an attempt to take it before night fell"同义词:travelgolocomotecause to move, both in a concrete and in an abstract sense"The director moved more responsibilities onto his new assistant"同义词:displacemove so as to change position, perform a nontranslational motion"He moved his hand slightly to the right"change residence, affiliation, or place of employment"We moved from Idaho to Nebraska"; "The basketball player moved from one team to another"follow a procedure or take a course同义词:goproceedbe in a state of action同义词:be activego or proceed from one point to another"the debate moved from family values to the economy"perform an action, or work out or perform (an action)"We must move quickly"同义词:acthave an emotional or cognitive impact upon同义词:affectimpressstrikegive an incentive for action"This moved me to sacrifice my career"同义词:motivateactuatepropelpromptincitearouse sympathy or compassion in"Her fate moved us all"dispose of by selling"The chairman of the company told the salesmen to move the computers"progress by being changed同义词:gorunlive one's life in a specified environment"she moves in certain circles only"have a turn; make one's move in a game同义词:gopropose formally; in a debate or parliamentary meeting同义词:make a motion

学习怎么用

词汇搭配

用作动词 (v.)~+名词move a step移动一步move an army调动军队move an engine开动引擎move heaven and earth尽最大努力move house搬家move one's hand使手动move one's head使头动move one's lips使嘴唇动move the capital from...to...把首都从…迁到…move the furniture搬家具move troops调动军队~+副词move ahead朝前移到move upwards上升move automatically自动移动move bodily整体地移动move cautiously谨慎地移动move deeply深深地感动move gracefully优美地移动move impatiently不耐烦地移动move intelligibly可理解地感动move passively消极地行动move profoundly深深地感动move rashly轻率地移动move stealthily隐蔽地移动move tremulously震颤地移动move violently猛烈地移动move along往前移move away移开move back搬(迁)回,后退move down往下移动,向前移动move in搬进move off移开move on往前移move out搬出去move over挪开些,挪到一边去move up晋升~+介词move about来回移动move against the enemy向敌军进击move along the road沿路前进move at为…感动move for提议,建议,要求,请求move from从…搬走,离开…move in the circle of在…圈子中活动move into the country搬往农村move on schedule按预定计划进行move out of搬出move round the sun绕太阳运行move toward the table走向桌子move with the time跟上时代步伐用作名词 (n.)动词+~alternate move交替行动attempt move采取行动calculate move预测步骤check a move制止行动determine move决定行动devise move设计步骤encourage move促进行动favour a move赞成某一行动get a move on赶快guard move防范行动limit move限制行动know a move知道某一行动lose a move to sb输人一着make a move采取行动study move研究步骤undertake move着手行动形容词+~safe move安全措施shrewd move精明的一着wise move明智的做法adroit move机敏的行动ambitious move野心勃勃的行动bad move错误的行动,走一着坏棋brilliant move英明的提议careless move不慎的一着clever move机智的一着decisive move决策definite move明确的行动false move错误的一着forward move向前推进good move高明的一着graceful move优美的动作latest move最新的行动next move下一步行动opening move开局的第一步棋political move政治行动practical move实际的行动,实际步骤safe move安全的行动smart move机智的一着strategic move战略行动stupid move愚蠢的一着the first move第一步行动wrong move错误的一着名词+~peace move和平行动reprisal move报复性行动介词+~after two moves移动两次以后protection on move行军警戒on the move迁移不定,在前进,在活动中~+介词a move towards…的一个步骤

词组短语

on the move在活动中,在进行中;四处奔波move on往前走,前进;出发,离开move in生活于;周旋于;向内投move forward向前移动,提步向前;向前发展move into移入;迁入新居move from使从…中醒悟过来;从…搬走,离开…make a move走一步;开始行动;搬家move up提升,上升;向前移动move towards走向,接近move out搬出;开始行动move away离开;搬走,移开move around v. 走来走去;绕着……来回转 move away from从…离开;抛弃move back v. 退缩 move through穿过move about走来走去;经常搬家move ahead前进;进行;进展move out of搬出;脱离;摆脱first move第一步;先走move along往里走;继续向前或后移动 更多收起词组短语

同近义词辨析

transfer, remove, shift, move这组词都有“从一处移往另一处”的意思,其区别是:transfer一般表示转送或移交迁移,尤指交通运输中的换乘或职务的调动等。remove作“移动”解时,与move可换用,还可指撤职或开除学藉等。shift侧重位置与方向的改变。move普通用词,指从一处到另一外的任何距离的转移。 movement, motion, move这组词都有“运动”的意思,其区别是:movement通常抽象地指有规则的动作或定向运动,特指政治性的运动。motion指不处于静止状态而在移动的过程中,强调运动本身,而不涉及其动因。move着重开始的行动或变化。 remove, moveremove 从一处移到另一处 remove the table to the kitchenmove动一动,但不一定移走, touch, inspire, move这组词都有“感动,打动”的意思,其区别是:touch主要用于表示怜悯或同情等场合,侧重感动。inspire指激起勇气和信心,侧重鼓励,有时含“启发灵感”之意。move与touch可换用,但语气强一些,运用范围广些。

双语例句

用作名词(n.)The army is on the move.军队在移动。This move is now in preparation.这一步骤,目前正在准备中。Their move to Latin America was a leap in the dark.他们迁居拉丁美洲是件冒险的事。Evans is a rare dancer, whose moves are so elegant.伊万是个杰出的舞者,他的动作非常优美。用作及物动词(vt.)Give me a place to stand and I will move the world.给我一个支点,我会推动地球。That desk is fixed, don't try to move it.那张桌子是固定的,别去移动它。The woman is deeply moved by his selfless spirit.妇女被他的无私精神深深感动了。用作不及物动词(vi.)Give it a hard push, then it will move.用力推一下,就能使它移动。My family moved here two years ago.我们全家两年前搬到这儿。Nobody seems willing to move in the matter.似乎没有人愿意对这件事采取行动。

权威例句

Move & Improve: a worksite wellness program in Maine.Detection of copy-move forgery in digital imagesThe visual analysis of human move-ment: A surveyDo Stock Prices Move Too Much to be Justified by Subsequent Changes in Dividends?Do Stock Prices Move Too Much to be Justified by Subsequent Changes in Dividends? CommentSecurity in Infancy, Childhood, and Adulthood: A Move to the Level of RepresentationSHILLER, . Do Stock Prices Move Too Much to be Justified by Subsequent Changes in Dividends?, The American Economic Review, , .Security in infancy, childhood, and adulthood: A move to the level of representation. Monographs of the Society for Research on Chil...Ottawa Charter for Health Promotion: An International Conference on Health Promotion—The Move Towards a New Public Health, Nov. 17...A Platform with Six Degrees of Freedom: A new form of mechanical linkage which enables a platform to move simultaneously in all six ...

同义词transplant

translocation

step

split

sliding

shift

roaming

remove

removal

remotion

put

procedure

motion

migration

leave

dislodgment

dislodging

ambulation

affect 反义词stop

stay

stand still 同根词movingly

moving

mover

movement

moved

moveable

move

movable m开头的单词mystery shopper

mystery story

myoglobin isoenzyme of creatine kinase

mystery novel

myosin light chain kinase

myotonic dystrophy

myocardial infarction

mycoplasma pneumonia

mycosis fungoides

myeloid stem cell

mycobacterium tuberculosis

Mycophenolate Mofetil 词汇所属分类第一滴血First Blood

降世神通(Avatar)

《绝望的主妇》(Desperate Housewives) 全八季词频大全

机器人总动员 WALL·E

傲慢与偏见与僵尸 Pride and Prejudice and Zombies

复仇者联盟2:奥创纪元 Avengers: Age of Ultron 字母词汇表更多l开头的单词LZ

Lytton

lyttae

lytta

Lytle

lytic

v开头的单词vyingly

vying

vycor

vyborg

VxWorks

VXI

y开头的单词YYC

Yy

ywis

YWCA

yvonne

Yvette 分类词汇表更多文学艺术zinc

zephyr

yellow

wrought iron

writer

worship

初中zookeeper

zoo

Zig Zag

zero

zebra crossing

zebra

其他词汇书zymurgy

zymurgy

zymurgy

zymoscope

zymology

zygote 人名姓氏表更多男zack

zachary

Zachariah

young

York

Yates

女Zola

Zoe

Zenobia

Zenia

Zena

Zandra

男/女Yong

wynn

winter

willie

Whitney

wally 新东方柯林斯词典 托福考试练习 雅思预测2024年雅思考试重点题汇总[听力|阅读|写作|口语]

2024年2月雅思考试听力|阅读|写作|口语重点题汇总

2024年1月雅思考前必刷题听力|阅读|口语|写作汇总

2024年3月雅思考试听力|阅读|写作|口语重点题汇总

[雅思考前必刷]2024年1月雅思口语考前必刷题Part 2&3地点类

2020年9月雅思口语新题part1:shopping

2021年1月雅思口语新题part2:你认为可以教别人的技能

[雅思考前必刷]2024年1月雅思口语考前必刷题Part 2&3事件类

2020年9月雅思口语新题part1:Activity

2021年1月雅思口语新题part2:你以前看过的现场体育赛事

关于我们

商务合作

广告服务

代理商区域

客服中心

在线留言

合作伙伴

人员招聘

联系我们

网站地图

© 2000-2024 koolearn.com 版权所有    全国客服专线:400-676-2300

京ICP证050421号 京ICP备05067669号-2  京公安备110-1081940  网络视听许可证0110531号

新东方教育科技集团旗下成员公司

move(英语单词)_百度百科

(英语单词)_百度百科 网页新闻贴吧知道网盘图片视频地图文库资讯采购百科百度首页登录注册进入词条全站搜索帮助首页秒懂百科特色百科知识专题加入百科百科团队权威合作下载百科APP个人中心move是一个多义词,请在下列义项上选择浏览(共15个义项)添加义项收藏查看我的收藏0有用+10move播报讨论上传视频英语单词move的基本意思是“动”,可指人体姿势的改变,更多的是指人〔物〕位置的移动,引申还可表示“(使)动摇,(使)醒悟”“(使)感动”等,强调某种起促动作用的动因,外界影响或内在动机。作此解时,可用作不及物动词,也可用作及物动词,作及物动词时接名词、代词作宾语,也可接以动词不定式充当补足语的复合宾语,意为“促使(某人)做某事”。中文名移动,向前移外文名move类    型英语单词基本含义动词引    申(使)动摇、醒悟、感动变    形moves,moved,moving目录1用作动词▪英汉双解▪词汇搭配▪词语辨析▪正误解析▪注意点2用作名词▪基本释义▪基本要点▪词语搭配▪常用短语▪相似词语解析3同义词用作动词播报编辑moves; moved; moving英汉双解vt. & vi. 1.移动; 搬动 [1] change place or positionvi. 2.搬家,迁移 change place by movingvi. 3.进展,前进,展开 advance; get nearer to an endvt. 4.使感动 cause (a person) to feel pity, sadness, anger, admiration, etc.vt. 5.提议,要求 make at a meeting (a formal suggestion on which arguments for and against are beard, and a decision taken, especially by voting)2.move还可表示“(在会议上正式地)提议,要求”,此时其后常接that从句,从句中谓语动词可用虚拟语气,且常省略should。3.move用作不及物动词也有“动”的含义,有时还可以用于表示抽象意义的“前进,活动,生活”等,还可表示“骚动”“蠢蠢欲动”。4.move的现在进行时可表示按计划、安排或打算将要发生的动作,这时常与将来的时间状语连用,或有特定的上下文。5.move在美式英语中用作不及物动词时,还可表示“搬家”,相当于英式英语的成语move house。词汇搭配~+名词move a step 移动一步move an army 调动军队move an engine 开动引擎move heaven and earth 尽最大努力move house 搬家move one's hand 使手动move one's head 使头动move one's lips 使嘴唇动move the capital from...to... 把首都从…迁到…move the furniture 搬家具move troops 调动军队~+副词move ahead 朝前移到move upwards 上升move automatically 自动移动move bodily 整体地移动move cautiously 谨慎地移动move deeply 深深地感动move gracefully 优美地移动move impatiently 不耐烦地移动move intelligibly 可理解地感动move passively 消极地行动move profoundly 深深地感动move rashly 轻率地移动move stealthily 隐蔽地移动move tremulously 震颤地移动move violently 猛烈地移动move along 往前移move away 移开move back 搬(迁)回,后退move down 往下移动,向前移动move in 搬进move off 移开move on 往前移move out 搬出去move over 挪开些,挪到一边去move up 晋升~+介词move about 来回移动move against the enemy 向敌军进击move along the road 沿路前进move at 为…感动move for 提议,建议,要求,请求move from 从…搬走,离开…move in the circle of 在…圈子中活动move into the country 搬往农村move on schedule 按预定计划进行move out of 搬出move round the sun 绕太阳运行move toward the table 走向桌子move with the time 跟上时代步伐词语辨析moving, moved这两个词分别是move的现在分词和过去分词,都可用作形容词。其区别是:moving的意思是“活动的或能活动的,前进的或发展的,动人的,感人的”。它表示某物的特征或特点,但不能表示某人的心理活动。moved含有被动意义或完成意义。它既可以表示人的心理活动,也可以表示某人由于受到感动而产生的外部表情等。例如:This is a moving story.这是一个感人的故事。The moved tears came down his face.感动的泪水顺着他的脸颊流下来。move, remove, shift, transfer这组词都可表示“移动”。其区别是:move主要指改变位置或姿势,是这组同义词中使用最广泛的; remove着重于离开或脱离原来的位置、处所、职位、职业等,作一种新的、有时是暂时的安排或改变,多是有意识地移动; shift着重于位置或方向的改变,常用于口语中,它还带有不稳定、不安的含义; transfer指从一个容器、车船等交通工具,或者所有制转换到另一个容器、另一种交通工具或所有制中。例如:He removed the child from the class.他把小孩从班上带走。He shifted impatiently in his seat during the long speech.在听冗长的报告时,他不耐烦地在座位上挪来挪去。At London we transferred from the train to a bus.在伦敦我们由火车改乘公共汽车。move, actuate, drive, prompt这组词均有促使某人按某种方式行动的意思。其区别是:move为一般用语,不强调动因是外部力量还是个人的动机; actuate为正式用语,动因来自一种强大的内在力量,如强烈的感情、欲望或信念; drive指持续不断地向前推进,或指受内力或外力的驱使; prompt多用于动因不太重要的场合。例如:He is actuated not by kindness but by ambition.他并非出于好心,而是出于个人野心。They drove to the station.他们开车到车站去。The sight of the ships prompted thoughts of his distant home.看到船他便想起遥远的故乡。move on, advance这两者都可表示“前进”。其区别是:move on是非正式用语,指从一点向另一地点前进,但不表明所前进的目的地; advance表示向一固定目标或目的地推进。例如:The blackboard moved on.那块黑板继续向前移动。Napoleon's army advanced on Moscow.拿破仑的军队向莫斯科推进。move, affect, touch这组词都有“感动”的意思。其区别是:move指足以产生某一行动或情感的流露、表露; affect则强调“怜悯”“温柔”,是普通用词; touch是语气更强烈的词,含有“哀泣”的意味。例如:She was deeply affected by the news of his death.他去世的消息使她深感悲痛。His sad story so touched us that we nearly cried.他那悲惨的遭遇深深打动了我们,使我们几乎要哭出声来。正误解析例1.我们明天搬家。[误] We are moving a/the house tomorrow.[误] We are moving our house tomorrow.[正] We are moving house tomorrow.[析] 短语move house是固定短语,在house前不能加饰任何修饰语和限定语。例2.我一年前搬到了北京。[误] I have moved to Beijing for a year.[正] It is a year since I moved to Beijing.[析] move是瞬间动词,不可与表示一段时间的状语连用。例3.听到那消息,她感动地流下泪来。[误] She moved to tears at the news.[正] She was moved to tears at the news.[析] move是及物动词,表示“感动得流泪”,应该说be moved to tears。例4.她被那悲伤的影片所深深打动了,禁不住哭起来。[误] Deeply moving by the sad film, she couldn't help crying.[正] Deeply moved by the sad film, she couldn't help crying.[析] 分词作状语时,其逻辑上的主语就是句子的主语。表示主动意味时应该用现在分词,表示被动意味时应用过去分词。注意点move一般不用于被动结构,用于be ~ed结构表示主语的感觉和情绪时,是系表结构。用作名词播报编辑基本释义S 1. 动,移动,动作 an act of moving, movementC 2. 一步,一着 an act of taking a piece from one square and putting it on anotherC 3. 行动,行动步骤 sth (to be) done to achieve a purposeC 4. 迁移,搬家 an act of going to a new home, office, etc.基本要点1.move用作名词可表示位置或场所的变换,如“搬家,挪动,活动(人的某一部位)”等,也可表示为达到某一目的而采取的“行动,行动步骤”,还可用于表示棋坛上“(棋的,或其他盘上游戏的)一步,走法,下棋的一步”,有时可表示演员,运动员等的“动作”。2.move表示抽象动作时是不可数名词,但可与不定冠词a连用,表示具体动作或步骤时是可数名词,有复数形式。词语搭配动词+~alternate move 交替行动attempt move 采取行动calculate move 预测步骤check a move 制止行动determine move 决定行动devise move 设计步骤encourage move 促进行动favour a move 赞成某一行动get a move on 赶快guard move 防范行动limit move 限制行动know a move 知道某一行动lose a move to sb 输人一着make a move 采取行动study move 研究步骤undertake move 着手行动形容词+~safe move 安全措施shrewd move 精明的一着wise move 明智的做法adroit move 机敏的行动ambitious move 野心勃勃的行动bad move 错误的行动,走一着坏棋brilliant move 英明的提议careless move 不慎的一着clever move 机智的一着decisive move 决策definite move 明确的行动false move 错误的一着forward move 向前推进good move 高明的一着graceful move 优美的动作latest move 最新的行动next move 下一步行动opening move 开局的第一步棋political move 政治行动practical move 实际的行动,实际步骤safe move 安全的行动smart move 机智的一着strategic move 战略行动stupid move 愚蠢的一着the first move 第一步行动wrong move 错误的一着名词+~peace move 和平行动reprisal move 报复性行动介词+~after two moves 移动两次以后protection on move 行军警戒on the move 迁移不定,在前进,在活动中~+介词a move towards …的一个步骤常用短语get a move on赶快 make haste; hurry upWe'd better get a move on before it rains.我们最好在下雨之前赶快做。Tell Harry to get a move on.叫哈里快些。on the move1.在移动中 busy, activeOur airplanes reported that large enemy forces were on the move.我们的飞机报告:大量敌军在移动中。He likes selling rather than office work because it keeps him on the move.他喜欢推销,不喜欢坐办公室,因为推销可以使他到处走动。2.在行动 going from place to placeHe wanted to be on the move.他希望行动。3.在进步中 advancing; progressingIt is said that civilization is always on the move.有人说文明经常在进步。相似词语解析movement, motion, move这三个词的共同意思是“运动”。其区别是:1.movement一般指具体动作; motion则主要指抽象的、与静对立的“动”,不管是自己在动还是受外力而动。motion还可指位置的移动,也可指条件的改变或一系列运动的各个过程。多用于哲学或自然科学文献中。例如:We study the laws of motion.我们研究运动的规律。If a thing is in motion, it is not at rest.如果一个物体在运动,它就不是处于静止状态。2.movement强调运动保持一定的方向,并且是有规律的,而motion则没有此含义。3.move多指一次具体的动作或改变本身所在位置的移动,也用来指下棋中的一步或交涉、斗争中的一着。move多具有明确的目的性。例如:The detectives are watching his every move.警探在注视着他的一举一动。Their next move on their tour will be from Dover to London.他们旅行的下一步将是从多佛去伦敦。When the hostess made a move from the table, all the guests arose and followed her to the drawing room.当女主人离开餐桌时,所有的客人都起立跟着她来到客厅。The next move is yours.下一步棋该你走了。同义词播报编辑v. advance, go on, proceed, progress; propel, push, shift; affect, influence, touch n. action, motion, movement新手上路成长任务编辑入门编辑规则本人编辑我有疑问内容质疑在线客服官方贴吧意见反馈投诉建议举报不良信息未通过词条申诉投诉侵权信息封禁查询与解封©2024 Baidu 使用百度前必读 | 百科协议 | 隐私政策 | 百度百科合作平台 | 京ICP证030173号 京公网安备110000020000

std::move - C++中文 - API参考文档

std::move - C++中文 - API参考文档

API Reference Document

std::move

< cpp‎ | utility

  C++

语言

标准库头文件

自立与有宿主实现

具名要求

语言支持库

概念库 (C++20)

诊断库

工具库

字符串库

容器库

迭代器库

范围库 (C++20)

算法库

数值库

本地化库

输入/输出库

文件系统库 (C++17)

正则表达式库 (C++11)

原子操作库 (C++11)

线程支持库 (C++11)

技术规范

 工具库

语言支持

类型支持(基本类型、 RTTI 、类型特征)

库功能特性测试宏 (C++20)

动态内存管理

程序工具

错误处理

协程支持 (C++20)

变参数函数

launder(C++17)

initializer_list(C++11)

source_location(C++20)

三路比较 (C++20)

three_way_comparablethree_way_comparable_with(C++20)(C++20)

strong_ordering(C++20)

weak_ordering(C++20)

partial_ordering(C++20)

common_comparison_category(C++20)

compare_three_way_result(C++20)

compare_three_way(C++20)

strong_order(C++20)

weak_order(C++20)

partial_order(C++20)

compare_strong_order_fallback(C++20)

compare_weak_order_fallback(C++20)

compare_partial_order_fallback(C++20)

is_eqis_neqis_ltis_lteqis_gtis_gteq(C++20)(C++20)(C++20)(C++20)(C++20)(C++20)

通用工具

日期和时间

函数对象

格式化库 (C++20)

bitset

hash(C++11)

integer_sequence(C++14)

关系运算符 (C++20 中弃用)

rel_ops::operator!=rel_ops::operator>rel_ops::operator<=rel_ops::operator>=

整数比较函数

cmp_equalcmp_not_equalcmp_lesscmp_greatercmp_less_thancmp_greater_than(C++20)(C++20)(C++20)(C++20)(C++20)(C++20)

in_range(C++20)

swap 与类型运算

swap

ranges::swap(C++20)

exchange(C++14)

declval(C++11)

forward(C++11)

move(C++11)

move_if_noexcept(C++11)

as_const(C++17)

常用词汇类型

pair

tuple(C++11)

apply(C++17)

make_from_tuple(C++17)

optional(C++17)

any(C++17)

variant(C++17)

初等字符串转换

to_chars(C++17)

from_chars(C++17)

chars_format(C++17)

 

定义于头文件

template< class T >

typename std::remove_reference::type&& move( T&& t ) noexcept;

(C++11 起) (C++14 前)

template< class T >

constexpr std::remove_reference_t&& move( T&& t ) noexcept;

(C++14 起)

std::move 用于指示对象 t 可以“被移动”,即允许从 t 到另一对象的有效率的资源传递。

特别是, std::move 生成标识其参数 t 的亡值表达式。它准确地等价于到右值引用类型的 static_cast 。

参数

t

-

要被移动的对象

返回值

static_cast::type&&>(t)

注解

以右值参数(如临时对象的纯右值或如 std::move 所产生者的亡值之一)调用函数时,重载决议选择接受右值引用参数的版本(包含移动构造函数、移动赋值运算符及常规成员函数,如 std::vector::push_back )。若参数标识一个占有资源的对象,则这些重载拥有移动参数所保有的任何资源的选择,但不强求如此。例如,链表的移动构造函数可以复制指向表头的指针,并将 nullptr 存储到参数中,而非分配并复制逐个结点。

右值引用变量的名称是左值,而若要绑定到接受右值引用参数的重载,就必须转换到亡值,此乃移动构造函数与移动赋值运算符典型地使用 std::move 的原因:

// 简单的移动构造函数

A(A&& arg) : member(std::move(arg.member)) // 表达式 "arg.member" 为左值

{}

// 简单的移动赋值运算符

A& operator=(A&& other) {

member = std::move(other.member);

return *this;

}

一个例外是当函数参数类型是到模板形参的右值引用(“转发引用”或“通用引用”)时,该情况下转而使用 std::forward 。

除非另外指定,否则所有已被移动的标准库对象被置于合法但未指定的状态。即只有无前提的函数,例如赋值运算符,才能安全地在对象被移动后使用:

std::vector v;

std::string str = "example";

v.push_back(std::move(str)); // str 现在合法但未指定

str.back(); // 若 size() == 0 则为未定义行为: back() 拥有前提 !empty()

str.clear(); // OK , clear() 无前提

而且,以亡值参数调用的标准库函数可以假设该参数是到对象的唯一引用;若它从左值带 std::move 构造,则不进行别名检查。尤其是,这表明标准库移动运算符不进行自赋值检查:

std::vector v = {2, 3, 3};

v = std::move(v); // 未定义行为

示例

运行此代码

#include

#include

#include

#include

 

int main()

{

std::string str = "Hello";

std::vector v;

 

// 使用 push_back(const T&) 重载,

// 表示我们将带来复制 str 的成本

v.push_back(str);

std::cout << "After copy, str is \"" << str << "\"\n";

 

// 使用右值引用 push_back(T&&) 重载,

// 表示不复制字符串;而是

// str 的内容被移动进 vector

// 这个开销比较低,但也意味着 str 现在可能为空。

v.push_back(std::move(str));

std::cout << "After move, str is \"" << str << "\"\n";

 

std::cout << "The contents of the vector are \"" << v[0]

<< "\", \"" << v[1] << "\"\n";

}

可能的输出:

After copy, str is "Hello"

After move, str is ""

The contents of the vector are "Hello", "Hello"

参阅

forward(C++11)

转发一个函数实参 (函数模板)

move_if_noexcept(C++11)

若移动构造函数不抛出则获得右值引用 (函数模板)

move(C++11)

将某一范围的元素移动到一个新的位置 (函数模板)

Move 教程 | 登链社区 | 区块链技术社区

Move 教程 | 登链社区 | 区块链技术社区

文章

问答

讲堂

专栏

集市

更多

提问

发表文章

活动

文档

招聘

发现

Toggle navigation

首页 (current)

文章

问答

讲堂

专栏

活动

招聘

文档

集市

搜索

登录/注册

Move 教程

MoveMoon

更新于 2022-09-22 16:29

阅读 4967

本文将通过开发Move代码的一些步骤,包括Move模块的设计、实现、单元测试和形式验证,全文总共有九个步骤。

欢迎来到Move教程! 在本教程中,我们将通过开发Move代码的一些步骤,包括Move模块的设计、实现、单元测试和形式验证。

总共有九个步骤:

- 第0步:安装

- 第1步:编写我的第一个Move 模块

- 第2步:为我的第一个Move 模块添加单元测试

- 第3步:设计我的 `BasicCoin `模块

- 第4步:实现我的 `BaseCoin `模块

- 第5步:在 `BasicCoin `模块中添加和使用单元测试

- 第6步:使我的 `BasicCoin `模块通用化

- 第7步:使用 Move 验证器(Move prover)

- 第8步:为 `BasicCoin `模块编写正式规范

每个步骤都被设计成在相应的`step_x`文件夹中自成一体。例如,如果你想跳过第1到第4步的内容,请随意跳到第5步,因为我们在第5步之前写的所有代码都在`step_5`文件夹中。在一些步骤的末尾,我们还包括更多高级主题的补充材料。

> 教程代码: https://github.com/move-language/move/tree/main/language/documentation/tutorial

现在让我们开始吧!

## 第0步:安装

如果你还没有,打开你的终端并克隆[Move repository](https://github.com/move-language/move)。

```

git clone https://github.com/move-language/move.git

```

进入`move`目录并运行`dev_setup.sh`脚本。

```

cd move

./scripts/dev_setup.sh -ypt

```

按照脚本的提示来安装Move的所有依赖项。

该脚本将环境变量定义添加到你的`~/.profile`文件中。通过运行这条命令将其包含在内。

```

source ~/.profile

```

接下来,通过运行以下命令来安装Move的命令行工具。

```

cargo install --path language/tools/move-cli

```

你可以通过运行以下命令来检查它是否工作。

```

move --help

```

你应该看到类似这样的东西,以及一些命令的列表和描述。

```

move-package

Execute a package command. Executed in the current directory or the closest containing Move package

USAGE:

move [OPTIONS]

OPTIONS:

--abi Generate ABIs for packages

...

```

如果你想找到哪些命令是可用的以及它们的作用,运行带有`--help`标志的命令或子命令将打印出文档。

在运行接下来的步骤之前,`cd`到教程目录。

```

cd /language/documentation/tutorial

```

**Visual Studio代码Move支持**

Visual Studio Code有官方的Move支持。你需要先安装Move分析器:

```

cargo install --path language/move-analyzer

```

现在你可以通过打开VS Code,在扩展窗格中搜索 `move-analyzer `来安装VS扩展,并安装它。更详细的说明可以在扩展的[README](https://github.com/move-language/move/tree/main/language/move-analyzer/editors/code) 中找到

## 第1步:编写第一个Move模块

改变目录进入[`step_1/BasicCoin`](https://github.com/solana-labs/move/blob/main/language/documentation/tutorial/step_1/BasicCoin)目录。你应该看到一个叫做 `sources `的目录 -- 这是这个包的所有Move代码所在的地方。你还应该看到一个`Move.toml`文件。如果你熟悉Rust和Cargo,`Move.toml`文件与`Cargo.toml`文件相似,`sources`目录与`src`目录相似。

让我们来看看一些Move的代码! 在你选择的编辑器中打开[`sources/FirstModule.move`](https://github.com/solana-labs/move/blob/main/language/documentation/tutorial/step_1/BasicCoin/sources/FirstModule.move)。你会看到的内容就是这个:

```rust

// sources/FirstModule.move

module 0xCAFE::BasicCoin {

...

}

```

这是定义了一个Move[模块](https://move-language.github.io/move/modules-and-scripts.html)。模块是Move代码的组成部分,它被定义为一个特定的地址: 模块可以被发布的地址。在这个例子中,`BasicCoin`模块只能在`0xCAFE`下发布。

> 译者注: 模块在发布者的地址下发布。标准库在 0x1 地址下发布。

现在让我们看看这个文件的下一部分,我们定义一个[结构体](https://move-language.github.io/move/structs-and-resources.html)来表示一个具有给定 `Value`的 `Coin`。

```rust

module 0xCAFE::BasicCoin {

struct Coin has key {

value: u64,

}

...

}

```

看一下文件的其余部分,我们看到一个函数定义,它创建了一个 `Coin `结构体并将其存储在一个账户下:

```rust

module 0xCAFE::BasicCoin {

struct Coin has key {

value: u64,

}

public fun mint(account: signer, value: u64) {

move_to(&account, Coin { value })

}

}

```

让我们看一下这个函数和它的内容:

- 它需要一个[`signer`](https://move-language.github.io/move/signer.html) -- 一个不可伪造代币,代表对一个特定地址的控制权,以及一个`value`来铸币。

- 它用给定的值创建一个`Coin`,并使用`move_to`操作符将其存储在`account`下。

让我们确保它可构建! 这可以通过在软件包文件夹中([`step_1/BasicCoin`](https://github.com/solana-labs/move/blob/main/language/documentation/tutorial/step_1/BasicCoin))下,用`build`命令来完成。

```

move build

```

**高级概念和参考资料:**

- 你可以通过命令创建一个空的Move包:

```

move new

```

- Move代码也可以放在其他一些地方。关于Move包系统的更多信息可以在[Move 册子](https://move-language.github.io/move/packages.html)中找到。

- 关于`Move.toml`文件的更多信息可以在[Move册子的包部分](https://move-language.github.io/move/packages.html#movetoml)中找到。

- Move也支持[命名地址](https://move-language.github.io/move/address.html#named-addresses)的想法,命名地址是一种将Move源代码参数化的方式,这样你就可以使用不同的`NamedAddr`值来编译模块,从而得到不同的字节码,你可以根据你所控制的地址来进行部署。如果频繁使用,可以在`Move.toml`文件中的`[address]`部分进行定义,例如:

```

[addresses]

SomeNamedAddress = "0xC0FFEE"

```

- Move中的[结构体](https://move-language.github.io/move/structs-and-resources.html)可以被赋予不同的[能力(abilities)](https://move-language.github.io/move/abilities.html),这些能力描述了可以用该类型做什么。有四种不同的能力:

- `copy`:允许具有这种能力的类型的值被复制。

- `drop`:允许具有这种能力的类型的值被丢弃(销毁)。

- `store`:允许具有这种能力的类型的值存在于全局存储的结构体中。

- `key`: 允许该类型作为全局存储操作的键。

因此,在 `BasicCoin `模块中,我们说 `Coin `结构体可以作为全局存储的一个键,由于它没有其他能力,它不能被复制、丢弃,或作为非键值存储在存储中。因此,你不能复制Coin,也不能意外地丢失Coin

- [函数](https://move-language.github.io/move/functions.html)默认是private(私有的),也可以是`public(公共的)`,[`public(friend)`](https://move-language.github.io/move/friends.html),或`public(script)`。其中最后一种说明这个函数可以从交易脚本中调用。`public(script)`函数也可以被其他`public(script)`函数调用。

- `move_to`是[五个不同的全局存储操作符](https://move-language.github.io/move/global-storage-operators.html)之一。

## 第2步:为第一个Move模块添加单元测试

现在我们已经看了我们的第一个Move模块,我们进行一下测试,以确保通过改变目录到[`step_2/BasicCoin`](https://github.com/solana-labs/move/blob/main/language/documentation/tutorial/step_2/BasicCoin),使铸币以我们期望的方式工作。Move中的单元测试与Rust中的单元测试相似,如果你熟悉它们的话 -- 测试用`#[test]`来注释,并像普通的Move函数一样编写。

你可以用`package test`命令来运行测试。

```

move test

```

现在让我们看看[`FirstModule.move`文件](https://github.com/solana-labs/move/blob/main/language/documentation/tutorial/step_2/BasicCoin/sources/FirstModule.move)的内容。你将看到这个测试。

```rust

module 0xCAFE::BasicCoin {

...

// Declare a unit test. It takes a signer called `account` with an

// address value of `0xC0FFEE`.

#[test(account = @0xC0FFEE)]

fun test_mint_10(account: signer) acquires Coin {

let addr = 0x1::signer::address_of(&account);

mint(account, 10);

// Make sure there is a `Coin` resource under `addr` with a value of `10`.

// We can access this resource and its value since we are in the

// same module that defined the `Coin` resource.

assert!(borrow_global(addr).value == 10, 0);

}

}

```

这是在声明一个名为 `test_mint_10 `的单元测试,在 `account `下铸造一个 `value`为 `10 `的 `Coin `结构体。然后检查存储中的铸币是否与`assert!`调用的预期值一致。如果断言失败,单元测试就会失败。

### 高级概念和练习

- 有许多与测试有关的注解是值得探讨的,它们可以在[这里](https://github.com/move-language/move/blob/main/language/changes/4-unit-testing.md#testing-annotations-their-meaning-and-usage)找到。你会在步骤5中看到其中的一些使用。

- 在运行单元测试之前,你总是需要添加一个对Move标准库的依赖。这可以通过在 `Move.toml `的`[dependencies]`部分添加一个条目来完成,例如:

```toml

[dependencies]

MoveStdlib = { local = `../../../../move-stdlib/`, addr_subst = { `std` = `0x1` } }

```

注意,你可能需要改变路径,使其指向`/language`下的`move-stdlib`目录。你也可以指定git的依赖性。你可以在[这里](https://move-language.github.io/move/packages.html#movetoml)阅读更多关于Move软件包依赖性的内容。

#### 练习

- 将断言改为`11`,这样测试就会失败。找到一个可以传递给`move test`命令的参数,它将显示测试失败时的全局状态。它应该看起来像这样:

```

┌── test_mint_10 ──────

│ error[E11001]: test failure

│ ┌─ ./sources/FirstModule.move:24:9

│ │

│ 18 │ fun test_mint_10(account: signer) acquires Coin {

│ │ ------------ In this function in 0xcafe::BasicCoin

│ ·

│ 24 │ assert!(borrow_global(addr).value == 11, 0);

│ │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Test was not expected to abort but it aborted with 0 here

│ ────── Storage state at point of failure ──────

│ 0xc0ffee:

│ => key 0xcafe::BasicCoin::Coin {

│ value: 10

│ }

└──────────────────

```

* 找到一个允许你收集测试覆盖率信息的参数,然后使用`move coverage`命令查看覆盖率统计和源代码覆盖率。

## 第3步:设计`BasicCoin`模块

在这一节中,我们将设计一个实现基本Coin和余额接口的模块,Coin可以在不同地址下持有的余额之间被铸造和转移。

公共Move函数的签名如下:

```rust

/// Publish an empty balance resource under `account`'s address. This function must be called before

/// minting or transferring to the account.

public fun publish_balance(account: &signer) { ... }

/// 铸造 `amount` tokens 到 `mint_addr`. 需要模块的 owner 授权

public fun mint(module_owner: &signer, mint_addr: address, amount: u64) acquires Balance { ... }

/// 返回 `owner` 的余额

public fun balance_of(owner: address): u64 acquires Balance { ... }

/// Transfers `amount` of tokens from `from` to `to`.

public fun transfer(from: &signer, to: address, amount: u64) acquires Balance { ... }

```

接下来我们看一下这个模块需要的数据结构。

一个Move模块并没有自己的存储空间。相反,Move的 "全局存储"(我们称之为我们的区块链状态)是根据地址索引的。每个地址下都有Move模块(代码)和Move资源(值)。

全局存储在Rust语法中看起来大致是这样的。

```rust

struct GlobalStorage {

resources: Map>

modules: Map>

}

```

每个地址下的Move资源存储是一个从类型到值的映射。(一个善于观察的读者可能会注意到,这意味着每个地址只能有每个类型的一个值)。这方便地为我们提供了一个以地址为索引的本地映射。在我们的 `BasicCoin `模块中,我们定义了以下 `Balance `资源,代表每个地址拥有的Coin数量。

```rust

/// Struct representing the balance of each address.

struct Balance has key {

coin: Coin // same Coin from Step 1

}

```

大致上,Move区块链状态应该是这样的:

![img](https://img.learnblockchain.cn/pics/20220921154923.png)

### 高级主题

#### `public(script)`函数

只有具有`public(script)`可见性的函数可以在交易中直接调用。因此,如果你想从交易中直接调用`transfer`方法,你要把它的签名改为:

```rust

public(script) fun transfer(from: signer, to: address, amount: u64) acquires Balance { ... }

```

在[这里](https://move-language.github.io/move/functions.html#visibility)阅读更多关于Move 函数可见性的说明。

#### 与以太坊/Solidity的比较

在大多数以太坊 ERC-20合约中,每个地址的余额被存储在一个`mapping(address => uint256)`类型的状态变量中。这个状态变量存储在特定智能合约的存储中。

以太坊区块链的状态可能看起来像这样:

![](https://img.learnblockchain.cn/pics/20220921155027.png)

## 第4步:实现`BaseCoin`模块

我们已经在`step_4`文件夹中为你创建了一个Move包,名为`BasicCoin`。`sources`文件夹包含了包中所有Move模块的源代码,包括`BasicCoin.move`。在这一节中,我们将仔细研究一下[`BasicCoin.move`](https://github.com/solana-labs/move/blob/main/language/documentation/tutorial/step_4/sources/BasicCoin.move)里面的方法的实现。

### 编译我们的代码

让我们首先在[`step_4/BasicCoin`](https://github.com/solana-labs/move/blob/main/language/documentation/tutorial/step_4/BasicCoin)文件夹中运行以下命令,尝试使用Move包构建代码。

```

move build

```

### 方法的实现

现在让我们仔细看看[`BasicCoin.move`](https://github.com/solana-labs/move/blob/main/language/documentation/tutorial/step_4/BasicCoin/sources/BasicCoin.move)里面的方法的实现。

**方法 `publish_balance`.**

这个方法发布一个`Balance`资源到一个给定的地址。因为这个资源需要通过铸币或转账来接收Coin,所以`publish_balance`方法必须由用户(包括模块所有者)在接收coin之前调用。

这个方法使用`move_to`操作来发布资源。

```

let empty_coin = Coin { value: 0 };

move_to(account, Balance { coin: empty_coin });

```

**方法 `mint `**

`mint`方法为一个给定的账户铸造Coin。这里我们要求`mint`必须得到模块所有者的授权。我们使用 assert 语句来强制执行。

```

assert!(signer::address_of(&module_owner) == MODULE_OWNER, errors::requires_address(ENOT_MODULE_OWNER));

```

Move中的断言语句可以这样使用:`assert! (, );`。这意味着如果``为假,那么就用``中止交易。这里`MODULE_OWNER`和`ENOT_MODULE_OWNER`都是在模块的开头定义的常量。而`errors`模块定义了我们可以使用的常见错误类别。值得注意的是,Move在执行过程中是事务性的 -- 所以如果出现[abort](https://move-language.github.io/move/abort-and-assert.html),不需要对状态进行解除,因为该交易的变化不会被持久化到区块链上。

然后我们将一个价值为`amount`的Coin存入`mint_addr`的余额。

```

deposit(mint_addr, Coin { value: amount });

```

**方法 `balance_of` **

我们使用`borrow_global`,全局存储操作符之一,从全局存储中读取。

```

borrow_global(owner).coin.value

| | \ /

resource type address field names

```

**方法 `transfer `**

这个函数从`from`的余额中提取代币并将代币存入`to`的余额中。我们仔细研究一下`withdraw`辅助函数:

```rust

fun withdraw(addr: address, amount: u64) : Coin acquires Balance {

let balance = balance_of(addr);

assert!(balance >= amount, EINSUFFICIENT_BALANCE);

let balance_ref = &mut borrow_global_mut(addr).coin.value;

*balance_ref = balance - amount;

Coin { value: amount }

}

```

在方法的开始,我们断言取款的账户有足够的余额。然后我们使用`borrow_global_mut`来获取全局存储的可变引用,`&mut`被用来创建一个结构体的[可变引用](https://move-language.github.io/move/references.html)。然后我们通过这个可变引用来修改余额,并返回一个带有提取金额的新Coin。

### 练习

我们的模块中有两个 "TODO",作为练习留给读者。

- 完成实现`publish_balance`方法。

- 实现 `deposit `方法。

这个练习的解决方案可以在[`step_4_sol`](https://github.com/solana-labs/move/blob/main/language/documentation/tutorial/step_4_sol)文件夹中找到。

**奖励练习**

- 如果我们把太多的代币存入余额,会发生什么?

## 第5步:添加和使用`BasicCoin`模块的单元测试

在这一步中,我们要看一下我们写的所有不同的单元测试,以覆盖我们在第四步中写的代码。我们还将看一下可以用来帮助我们写测试的一些工具。

为了开始工作,在[`step_5/BasicCoin`](https://github.com/solana-labs/move/blob/main/language/documentation/tutorial/step_5/BasicCoin)文件夹中运行`package test`命令:

```

move test

```

你应该看到类似这样的东西:

```

INCLUDING DEPENDENCY MoveStdlib

BUILDING BasicCoin

Running Move unit tests

[ PASS ] 0xcafe::BasicCoin::can_withdraw_amount

[ PASS ] 0xcafe::BasicCoin::init_check_balance

[ PASS ] 0xcafe::BasicCoin::init_non_owner

[ PASS ] 0xcafe::BasicCoin::publish_balance_already_exists

[ PASS ] 0xcafe::BasicCoin::publish_balance_has_zero

[ PASS ] 0xcafe::BasicCoin::withdraw_dne

[ PASS ] 0xcafe::BasicCoin::withdraw_too_much

Test result: OK. Total tests: 7; passed: 7; failed: 0

```

看看[`BasicCoin`模块](https://github.com/solana-labs/move/blob/main/language/documentation/tutorial/step_5/BasicCoin/sources/BasicCoin.move)中的测试,我们试图让每个单元测试保持在测试一个特定的行为。

### 练习

看完测试后,试着在`BasicCoin`模块中写一个名为`balance_of_dne`的单元测试,测试在`balance_of`被调用的地址下不存在`Balance`资源的情况。它应该只有几行!

这个练习的解决方案可以在[`step_5_sol`](https://github.com/solana-labs/move/blob/main/language/documentation/tutorial/step_5_sol)找到。

## 第6步:使`BasicCoin`模块通用化

在Move中,我们可以使用泛型来定义不同输入数据类型的函数和结构体。泛型是库代码的一个很好的构建块。在本节中,我们将使简单的`BasicCoin`模块成为泛型,这样它就可以作为一个库模块,被其他用户模块使用。

首先,我们为数据结构添加类型参数:

```rust

struct Coin has store {

value: u64

}

struct Balance has key {

coin: Coin

}

```

也以同样的方式向方法添加类型参数。例如,`withdraw`变成了下面的内容:

```rust

fun withdraw(addr: address, amount: u64) : Coin acquires Balance {

let balance = balance_of(addr);

assert!(balance >= amount, EINSUFFICIENT_BALANCE);

let balance_ref = &mut borrow_global_mut>(addr).coin.value;

*balance_ref = balance - amount;

Coin { value: amount }

}

```

看看[`step_6/BasicCoin/sources/BasicCoin.move`](https://github.com/solana-labs/move/blob/main/language/documentation/tutorial/step_6/BasicCoin/sources/BasicCoin.move)来看看完整的实现。

在这一点上,熟悉以太坊的读者可能会注意到,这个模块与[ERC20代币标准](https://ethereum.org/en/developers/docs/standards/tokens/erc-20/)的目的相似,它为在智能合约中实现可替换的代币提供了一个接口。使用泛型的一个关键优势是能够重用代码,因为泛型库模块已经提供了一个标准实现,而实例化模块可以通过包装标准实现来提供定制。

我们提供了一个名为[`MyOddCoin`](https://github.com/solana-labs/move/blob/main/language/documentation/tutorial/step_6/BasicCoin/sources/MyOddCoin.move)的小模块,它实例化了`Coin`类型并定制了其转移策略:只能转移奇数的Coin。我们还包括两个[测试](https://github.com/solana-labs/move/blob/main/language/documentation/tutorial/step_6/BasicCoin/sources/MyOddCoin.move)来测试这个行为。你可以使用你在第2步和第5步学到的命令来运行这些测试。

### 高级主题

`phantom`类型参数

在`Coin`和`Balance`的定义中,我们声明类型参数`CoinType`是`phantom` ,因为`CoinType`在结构体定义中没有使用,或者只作为`phantom` 类型参数使用。

[这里](https://move-language.github.io/move/generics.html#phantom-type-parameters)阅读更多关于`phantom`类型参数的信息。

## 高级步骤

在进入下一个步骤之前,让我们确保你已经安装了所有的验证器依赖项。

尝试运行`boogie /version`。如果出现 `command not found: boogie `的错误信息,你将不得不运行设置脚本和应用配置文件。

```bash

# run the following in move repo root directory

./scripts/dev_setup.sh -yp

source ~/.profile

```

## 第7步:使用Move验证器

部署在区块链上的智能合约可能会操纵高价值资产。作为一种使用严格的数学方法来描述行为和推理计算机系统的正确性的技术,形式验证已被用于区块链,以防止智能合约中的错误。[The Move prover](https://github.com/move-language/move/blob/main/language/move-prover/doc/user/prover-guide.md)是一个不断发展的形式验证工具,用于用Move语言编写的智能合约。用户可以使用[Move Specification Language (MSL)](https://github.com/move-language/move/blob/main/language/move-prover/doc/user/spec-lang.md)来指定智能合约的功能属性,然后使用验证器来自动静态地检查它们。为了说明如何使用验证器,我们在[BasicCoin.move](https://github.com/solana-labs/move/blob/main/language/documentation/tutorial/step_7/BasicCoin/sources/BasicCoin.move)中加入了以下代码片段。

```

spec balance_of {

pragma aborts_if_is_strict;

}

```

非正式地说,代码块`spec balance_of {...}`包含方法`balance_of`的属性规范。

让我们首先在[`BasicCoin`目录](https://github.com/solana-labs/move/blob/main/language/documentation/tutorial/step_7/BasicCoin)内使用以下命令运行验证器:

```

move prove

```

其中输出以下错误信息:

```

error: abort not covered by any of the `aborts_if` clauses

┌─ ./sources/BasicCoin.move:38:5

35 │ borrow_global>(owner).coin.value

│ ------------- abort happened here with execution failure

·

38 │ ╭ spec balance_of {

39 │ │ pragma aborts_if_is_strict;

40 │ │ }

│ ╰─────^

= at ./sources/BasicCoin.move:34: balance_of

= owner = 0x29

= at ./sources/BasicCoin.move:35: balance_of

= ABORTED

Error: exiting with verification errors

```

该验证器基本上告诉我们,我们需要明确指定函数`balance_of`将中止的条件,这是在`owner`不拥有资源`Balance`时调用函数`borrow_global`造成的。为了删除这个错误信息,我们添加了一个`aborts_if`条件,如下:

```

spec balance_of {

pragma aborts_if_is_strict;

aborts_if !exists>(owner);

}

```

添加这个条件后,再次尝试运行`prove`命令,以确认没有验证错误。

```

move prove

```

除了中止条件外,我们还想定义功能属性。在第8步中,我们将通过为定义了 `BasicCoin `模块的方法指定属性来对验证器进行更详细的介绍。

## 第8步:为 `BasicCoin `模块编写正式规范

### withdraw 方法

方法 `withdraw `的签名在下面给出:

```

fun withdraw(addr: address, amount: u64) : Coin acquires Balance

```

该方法从地址`addr`提取价值为`amount`的代币,并返回一个创建的价值为`amount`的Coin。当1)`addr`没有资源`Balance`或2)`addr`中的代币数量小于`amount`时,方法`withdraw`中止。我们可以这样定义条件。

```rust

spec withdraw {

let balance = global>(addr).coin.value;

aborts_if !exists>(addr);

aborts_if balance < amount;

}

```

正如我们在这里看到的,一个规范块可以包含let绑定,它为表达式引入名称。`global(address)。T `是一个内置函数,返回 `addr `处的资源值。`balance`是`addr`所拥有的代币的数量。`exists(address): bool`是一个内置函数,如果资源T在地址处存在,则返回true。两个`aborts_if`子句对应上面提到的两个条件。一般来说,如果一个函数有一个以上的`aborts_if`条件,这些条件就会相互or-ed。默认情况下,如果用户想指定中止条件,需要列出所有可能的条件。否则,验证器将产生一个验证错误。然而,如果`pragma aborts_if_is_partial`在spec块中被定义,组合的中止条件(or-ed的单个条件)只意味着函数的中止。读者可以参考[MSL](https://github.com/move-language/move/blob/main/language/move-prover/doc/user/spec-lang.md)文件了解更多信息。

下一步是定义功能属性,在下面的两个 `ensures `语句中描述。首先,通过使用`let post`绑定,`balance_post`表示执行后`addr`的余额,它应该等于`balance - amount`。然后,返回值(表示为`result`)应该是一个价值为`amount`的Coin。

```rust

spec withdraw {

let balance = global<Balance<CoinType>>(addr).coin.value;

aborts_if !exists<Balance<CoinType>>(addr);

aborts_if balance < amount;

let post balance_post = global<Balance<CoinType>>(addr).coin.value;

ensures balance_post == balance - amount;

ensures result == Coin<CoinType> { value: amount };

}

```

### `deposit `方法

方法 `deposit `的签名如下:

```

fun deposit(addr: address, check: Coin) acquires Balance

```

该方法将 `check`存入 `addr`。该规范定义如下:

```rust

spec deposit {

let balance = global>(addr).coin.value;

let check_value = check.value;

aborts_if !exists>(addr);

aborts_if balance + check_value > MAX_U64;

let post balance_post = global>(addr).coin.value;

ensures balance_post == balance + check_value;

}

```

`balance`代表执行前`addr`中的代币数量,`check_value`代表要存入的代币数量。如果1)`addr`没有资源`Balance`或2)`balance`和`check_value`之和大于`u64`类型的最大值,该方法将终止。该功能属性检查余额在执行后是否被正确更新。

### `transfer` 方法

方法 `transfer `的签名如下:

```

public fun transfer(from: &signer, to: address, amount: u64, _witness: CoinType) acquires Balance

```

该方法从`from`的账户向`to`的地址转移`amount`的Coin。说明如下:

```rust

spec transfer {

let addr_from = signer::address_of(from);

let balance_from = global>(addr_from).coin.value;

let balance_to = global>(to).coin.value;

let post balance_from_post = global>(addr_from).coin.value;

let post balance_to_post = global>(to).coin.value;

ensures balance_from_post == balance_from - amount;

ensures balance_to_post == balance_to + amount;

}

```

`addr_from`是`from`的地址。然后得到`addr_from`和`to`在执行前和执行后的余额。`ensures `语句规定,从`addr_from`中扣除`amount`的代币数量,并添加到`to`中。然而,验证器将产生如下错误信息。

```

error: post-condition does not hold

┌─ ./sources/BasicCoin.move:57:9

62 │ ensures balance_from_post == balance_from - amount;

│ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

...

```

当`addr_from`等于`to`时,该属性不被持有。因此,我们可以在方法中添加一个断言`assert!(from_addr != to)`,以确保`addr_from`不等于`to`。

### 练习

- 为 `transfer `方法实现 `aborts_if `条件。

- 实现`mint`和`publish_balance`方法的规范。

这个练习的解决方案可以在[`step_8_sol`](https://github.com/solana-labs/move/blob/main/language/documentation/tutorial/step_8_sol)找到。

原文: https://github.com/move-language/move/tree/main/language/documentation/tutorial

欢迎来到Move教程! 在本教程中,我们将通过开发Move代码的一些步骤,包括Move模块的设计、实现、单元测试和形式验证。

总共有九个步骤:

第0步:安装

第1步:编写我的第一个Move 模块

第2步:为我的第一个Move 模块添加单元测试

第3步:设计我的 BasicCoin模块

第4步:实现我的 BaseCoin模块

第5步:在 BasicCoin模块中添加和使用单元测试

第6步:使我的 BasicCoin模块通用化

第7步:使用 Move 验证器(Move prover)

第8步:为 BasicCoin模块编写正式规范

每个步骤都被设计成在相应的step_x文件夹中自成一体。例如,如果你想跳过第1到第4步的内容,请随意跳到第5步,因为我们在第5步之前写的所有代码都在step_5文件夹中。在一些步骤的末尾,我们还包括更多高级主题的补充材料。

教程代码: https://github.com/move-language/move/tree/main/language/documentation/tutorial

现在让我们开始吧!

第0步:安装

如果你还没有,打开你的终端并克隆Move repository。

git clone https://github.com/move-language/move.git

进入move目录并运行dev_setup.sh脚本。

cd move

./scripts/dev_setup.sh -ypt

按照脚本的提示来安装Move的所有依赖项。

该脚本将环境变量定义添加到你的~/.profile文件中。通过运行这条命令将其包含在内。

source ~/.profile

接下来,通过运行以下命令来安装Move的命令行工具。

cargo install --path language/tools/move-cli

你可以通过运行以下命令来检查它是否工作。

move --help

你应该看到类似这样的东西,以及一些命令的列表和描述。

move-package

Execute a package command. Executed in the current directory or the closest containing Move package

USAGE:

move [OPTIONS] <SUBCOMMAND>

OPTIONS:

--abi Generate ABIs for packages

...

如果你想找到哪些命令是可用的以及它们的作用,运行带有--help标志的命令或子命令将打印出文档。

在运行接下来的步骤之前,cd到教程目录。

cd <path_to_move>/language/documentation/tutorial

Visual Studio代码Move支持

Visual Studio Code有官方的Move支持。你需要先安装Move分析器:

cargo install --path language/move-analyzer

现在你可以通过打开VS Code,在扩展窗格中搜索 move-analyzer来安装VS扩展,并安装它。更详细的说明可以在扩展的README 中找到

第1步:编写第一个Move模块

改变目录进入step_1/BasicCoin目录。你应该看到一个叫做 sources的目录 -- 这是这个包的所有Move代码所在的地方。你还应该看到一个Move.toml文件。如果你熟悉Rust和Cargo,Move.toml文件与Cargo.toml文件相似,sources目录与src目录相似。

让我们来看看一些Move的代码! 在你选择的编辑器中打开sources/FirstModule.move。你会看到的内容就是这个:

// sources/FirstModule.move

module 0xCAFE::BasicCoin {

...

}

这是定义了一个Move模块。模块是Move代码的组成部分,它被定义为一个特定的地址: 模块可以被发布的地址。在这个例子中,BasicCoin模块只能在0xCAFE下发布。

译者注: 模块在发布者的地址下发布。标准库在 0x1 地址下发布。

现在让我们看看这个文件的下一部分,我们定义一个结构体来表示一个具有给定 Value的 Coin。

module 0xCAFE::BasicCoin {

struct Coin has key {

value: u64,

}

...

}

看一下文件的其余部分,我们看到一个函数定义,它创建了一个 Coin结构体并将其存储在一个账户下:

module 0xCAFE::BasicCoin {

struct Coin has key {

value: u64,

}

public fun mint(account: signer, value: u64) {

move_to(&account, Coin { value })

}

}

让我们看一下这个函数和它的内容:

它需要一个signer -- 一个不可伪造代币,代表对一个特定地址的控制权,以及一个value来铸币。

它用给定的值创建一个Coin,并使用move_to操作符将其存储在account下。

让我们确保它可构建! 这可以通过在软件包文件夹中(step_1/BasicCoin)下,用build命令来完成。

move build

高级概念和参考资料:

你可以通过命令创建一个空的Move包:

move new <pkg_name>

Move代码也可以放在其他一些地方。关于Move包系统的更多信息可以在Move 册子中找到。

关于Move.toml文件的更多信息可以在Move册子的包部分中找到。

Move也支持命名地址的想法,命名地址是一种将Move源代码参数化的方式,这样你就可以使用不同的NamedAddr值来编译模块,从而得到不同的字节码,你可以根据你所控制的地址来进行部署。如果频繁使用,可以在Move.toml文件中的[address]部分进行定义,例如:

[addresses]

SomeNamedAddress = "0xC0FFEE"

Move中的结构体可以被赋予不同的能力(abilities),这些能力描述了可以用该类型做什么。有四种不同的能力:

copy:允许具有这种能力的类型的值被复制。

drop:允许具有这种能力的类型的值被丢弃(销毁)。

store:允许具有这种能力的类型的值存在于全局存储的结构体中。

key: 允许该类型作为全局存储操作的键。

因此,在 BasicCoin模块中,我们说 Coin结构体可以作为全局存储的一个键,由于它没有其他能力,它不能被复制、丢弃,或作为非键值存储在存储中。因此,你不能复制Coin,也不能意外地丢失Coin

函数默认是private(私有的),也可以是public(公共的),public(friend),或public(script)。其中最后一种说明这个函数可以从交易脚本中调用。public(script)函数也可以被其他public(script)函数调用。

move_to是五个不同的全局存储操作符之一。

第2步:为第一个Move模块添加单元测试

现在我们已经看了我们的第一个Move模块,我们进行一下测试,以确保通过改变目录到step_2/BasicCoin,使铸币以我们期望的方式工作。Move中的单元测试与Rust中的单元测试相似,如果你熟悉它们的话 -- 测试用#[test]来注释,并像普通的Move函数一样编写。

你可以用package test命令来运行测试。

move test

现在让我们看看FirstModule.move文件的内容。你将看到这个测试。

module 0xCAFE::BasicCoin {

...

// Declare a unit test. It takes a signer called `account` with an

// address value of `0xC0FFEE`.

#[test(account = @0xC0FFEE)]

fun test_mint_10(account: signer) acquires Coin {

let addr = 0x1::signer::address_of(&account);

mint(account, 10);

// Make sure there is a `Coin` resource under `addr` with a value of `10`.

// We can access this resource and its value since we are in the

// same module that defined the `Coin` resource.

assert!(borrow_global<Coin>(addr).value == 10, 0);

}

}

这是在声明一个名为 test_mint_10的单元测试,在 account下铸造一个 value为 10的 Coin结构体。然后检查存储中的铸币是否与assert!调用的预期值一致。如果断言失败,单元测试就会失败。

高级概念和练习

有许多与测试有关的注解是值得探讨的,它们可以在这里找到。你会在步骤5中看到其中的一些使用。

在运行单元测试之前,你总是需要添加一个对Move标准库的依赖。这可以通过在 Move.toml的[dependencies]部分添加一个条目来完成,例如:

[dependencies]

MoveStdlib = { local = `../../../../move-stdlib/`, addr_subst = { `std` = `0x1` } }

注意,你可能需要改变路径,使其指向<path_to_move>/language下的move-stdlib目录。你也可以指定git的依赖性。你可以在这里阅读更多关于Move软件包依赖性的内容。

练习

将断言改为11,这样测试就会失败。找到一个可以传递给move test命令的参数,它将显示测试失败时的全局状态。它应该看起来像这样:

┌── test_mint_10 ──────

│ error[E11001]: test failure

│ ┌─ ./sources/FirstModule.move:24:9

│ │

│ 18 │ fun test_mint_10(account: signer) acquires Coin {

│ │ ------------ In this function in 0xcafe::BasicCoin

│ ·

│ 24 │ assert!(borrow_global<Coin>(addr).value == 11, 0);

│ │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Test was not expected to abort but it aborted with 0 here

│ ────── Storage state at point of failure ──────

│ 0xc0ffee:

│ => key 0xcafe::BasicCoin::Coin {

│ value: 10

│ }

└──────────────────

找到一个允许你收集测试覆盖率信息的参数,然后使用move coverage命令查看覆盖率统计和源代码覆盖率。

第3步:设计BasicCoin模块

在这一节中,我们将设计一个实现基本Coin和余额接口的模块,Coin可以在不同地址下持有的余额之间被铸造和转移。

公共Move函数的签名如下:

/// Publish an empty balance resource under `account`'s address. This function must be called before

/// minting or transferring to the account.

public fun publish_balance(account: &signer) { ... }

/// 铸造 `amount` tokens 到 `mint_addr`. 需要模块的 owner 授权

public fun mint(module_owner: &signer, mint_addr: address, amount: u64) acquires Balance { ... }

/// 返回 `owner` 的余额

public fun balance_of(owner: address): u64 acquires Balance { ... }

/// Transfers `amount` of tokens from `from` to `to`.

public fun transfer(from: &signer, to: address, amount: u64) acquires Balance { ... }

接下来我们看一下这个模块需要的数据结构。

一个Move模块并没有自己的存储空间。相反,Move的 "全局存储"(我们称之为我们的区块链状态)是根据地址索引的。每个地址下都有Move模块(代码)和Move资源(值)。

全局存储在Rust语法中看起来大致是这样的。

struct GlobalStorage {

resources: Map<address, Map<ResourceType, ResourceValue>>

modules: Map<address, Map<ModuleName, ModuleBytecode>>

}

每个地址下的Move资源存储是一个从类型到值的映射。(一个善于观察的读者可能会注意到,这意味着每个地址只能有每个类型的一个值)。这方便地为我们提供了一个以地址为索引的本地映射。在我们的 BasicCoin模块中,我们定义了以下 Balance资源,代表每个地址拥有的Coin数量。

/// Struct representing the balance of each address.

struct Balance has key {

coin: Coin // same Coin from Step 1

}

大致上,Move区块链状态应该是这样的:

高级主题

public(script)函数

只有具有public(script)可见性的函数可以在交易中直接调用。因此,如果你想从交易中直接调用transfer方法,你要把它的签名改为:

public(script) fun transfer(from: signer, to: address, amount: u64) acquires Balance { ... }

在这里阅读更多关于Move 函数可见性的说明。

与以太坊/Solidity的比较

在大多数以太坊 ERC-20合约中,每个地址的余额被存储在一个mapping(address => uint256)类型的状态变量中。这个状态变量存储在特定智能合约的存储中。

以太坊区块链的状态可能看起来像这样:

第4步:实现BaseCoin模块

我们已经在step_4文件夹中为你创建了一个Move包,名为BasicCoin。sources文件夹包含了包中所有Move模块的源代码,包括BasicCoin.move。在这一节中,我们将仔细研究一下BasicCoin.move里面的方法的实现。

编译我们的代码

让我们首先在step_4/BasicCoin文件夹中运行以下命令,尝试使用Move包构建代码。

move build

方法的实现

现在让我们仔细看看BasicCoin.move里面的方法的实现。

方法 publish_balance.

这个方法发布一个Balance资源到一个给定的地址。因为这个资源需要通过铸币或转账来接收Coin,所以publish_balance方法必须由用户(包括模块所有者)在接收coin之前调用。

这个方法使用move_to操作来发布资源。

let empty_coin = Coin { value: 0 };

move_to(account, Balance { coin: empty_coin });

方法 mint

mint方法为一个给定的账户铸造Coin。这里我们要求mint必须得到模块所有者的授权。我们使用 assert 语句来强制执行。

assert!(signer::address_of(&module_owner) == MODULE_OWNER, errors::requires_address(ENOT_MODULE_OWNER));

Move中的断言语句可以这样使用:assert! (<predicate>, <abort_code>);。这意味着如果<predicate>为假,那么就用<abort_code>中止交易。这里MODULE_OWNER和ENOT_MODULE_OWNER都是在模块的开头定义的常量。而errors模块定义了我们可以使用的常见错误类别。值得注意的是,Move在执行过程中是事务性的 -- 所以如果出现abort,不需要对状态进行解除,因为该交易的变化不会被持久化到区块链上。

然后我们将一个价值为amount的Coin存入mint_addr的余额。

deposit(mint_addr, Coin { value: amount });

方法 balance_of

我们使用borrow_global,全局存储操作符之一,从全局存储中读取。

borrow_global<Balance>(owner).coin.value

| | \ /

resource type address field names

方法 transfer

这个函数从from的余额中提取代币并将代币存入to的余额中。我们仔细研究一下withdraw辅助函数:

fun withdraw(addr: address, amount: u64) : Coin acquires Balance {

let balance = balance_of(addr);

assert!(balance >= amount, EINSUFFICIENT_BALANCE);

let balance_ref = &mut borrow_global_mut<Balance>(addr).coin.value;

*balance_ref = balance - amount;

Coin { value: amount }

}

在方法的开始,我们断言取款的账户有足够的余额。然后我们使用borrow_global_mut来获取全局存储的可变引用,&mut被用来创建一个结构体的可变引用。然后我们通过这个可变引用来修改余额,并返回一个带有提取金额的新Coin。

练习

我们的模块中有两个 "TODO",作为练习留给读者。

完成实现publish_balance方法。

实现 deposit方法。

这个练习的解决方案可以在step_4_sol文件夹中找到。

奖励练习

如果我们把太多的代币存入余额,会发生什么?

第5步:添加和使用BasicCoin模块的单元测试

在这一步中,我们要看一下我们写的所有不同的单元测试,以覆盖我们在第四步中写的代码。我们还将看一下可以用来帮助我们写测试的一些工具。

为了开始工作,在step_5/BasicCoin文件夹中运行package test命令:

move test

你应该看到类似这样的东西:

INCLUDING DEPENDENCY MoveStdlib

BUILDING BasicCoin

Running Move unit tests

[ PASS ] 0xcafe::BasicCoin::can_withdraw_amount

[ PASS ] 0xcafe::BasicCoin::init_check_balance

[ PASS ] 0xcafe::BasicCoin::init_non_owner

[ PASS ] 0xcafe::BasicCoin::publish_balance_already_exists

[ PASS ] 0xcafe::BasicCoin::publish_balance_has_zero

[ PASS ] 0xcafe::BasicCoin::withdraw_dne

[ PASS ] 0xcafe::BasicCoin::withdraw_too_much

Test result: OK. Total tests: 7; passed: 7; failed: 0

看看BasicCoin模块中的测试,我们试图让每个单元测试保持在测试一个特定的行为。

练习

看完测试后,试着在BasicCoin模块中写一个名为balance_of_dne的单元测试,测试在balance_of被调用的地址下不存在Balance资源的情况。它应该只有几行!

这个练习的解决方案可以在step_5_sol找到。

第6步:使BasicCoin模块通用化

在Move中,我们可以使用泛型来定义不同输入数据类型的函数和结构体。泛型是库代码的一个很好的构建块。在本节中,我们将使简单的BasicCoin模块成为泛型,这样它就可以作为一个库模块,被其他用户模块使用。

首先,我们为数据结构添加类型参数:

struct Coin<phantom CoinType> has store {

value: u64

}

struct Balance<phantom CoinType> has key {

coin: Coin<CoinType>

}

也以同样的方式向方法添加类型参数。例如,withdraw变成了下面的内容:

fun withdraw<CoinType>(addr: address, amount: u64) : Coin<CoinType> acquires Balance {

let balance = balance_of<CoinType>(addr);

assert!(balance >= amount, EINSUFFICIENT_BALANCE);

let balance_ref = &mut borrow_global_mut<Balance<CoinType>>(addr).coin.value;

*balance_ref = balance - amount;

Coin<CoinType> { value: amount }

}

看看step_6/BasicCoin/sources/BasicCoin.move来看看完整的实现。

在这一点上,熟悉以太坊的读者可能会注意到,这个模块与ERC20代币标准的目的相似,它为在智能合约中实现可替换的代币提供了一个接口。使用泛型的一个关键优势是能够重用代码,因为泛型库模块已经提供了一个标准实现,而实例化模块可以通过包装标准实现来提供定制。

我们提供了一个名为MyOddCoin的小模块,它实例化了Coin类型并定制了其转移策略:只能转移奇数的Coin。我们还包括两个测试来测试这个行为。你可以使用你在第2步和第5步学到的命令来运行这些测试。

高级主题

phantom类型参数

在Coin和Balance的定义中,我们声明类型参数CoinType是phantom ,因为CoinType在结构体定义中没有使用,或者只作为phantom 类型参数使用。

这里阅读更多关于phantom类型参数的信息。

高级步骤

在进入下一个步骤之前,让我们确保你已经安装了所有的验证器依赖项。

尝试运行boogie /version。如果出现 command not found: boogie的错误信息,你将不得不运行设置脚本和应用配置文件。

# run the following in move repo root directory

./scripts/dev_setup.sh -yp

source ~/.profile

第7步:使用Move验证器

部署在区块链上的智能合约可能会操纵高价值资产。作为一种使用严格的数学方法来描述行为和推理计算机系统的正确性的技术,形式验证已被用于区块链,以防止智能合约中的错误。The Move prover是一个不断发展的形式验证工具,用于用Move语言编写的智能合约。用户可以使用Move Specification Language (MSL)来指定智能合约的功能属性,然后使用验证器来自动静态地检查它们。为了说明如何使用验证器,我们在BasicCoin.move中加入了以下代码片段。

spec balance_of {

pragma aborts_if_is_strict;

}

非正式地说,代码块spec balance_of {...}包含方法balance_of的属性规范。

让我们首先在BasicCoin目录内使用以下命令运行验证器:

move prove

其中输出以下错误信息:

error: abort not covered by any of the `aborts_if` clauses

┌─ ./sources/BasicCoin.move:38:5

35 │ borrow_global<Balance<CoinType>>(owner).coin.value

│ ------------- abort happened here with execution failure

·

38 │ ╭ spec balance_of {

39 │ │ pragma aborts_if_is_strict;

40 │ │ }

│ ╰─────^

= at ./sources/BasicCoin.move:34: balance_of

= owner = 0x29

= at ./sources/BasicCoin.move:35: balance_of

= ABORTED

Error: exiting with verification errors

该验证器基本上告诉我们,我们需要明确指定函数balance_of将中止的条件,这是在owner不拥有资源Balance<CoinType>时调用函数borrow_global造成的。为了删除这个错误信息,我们添加了一个aborts_if条件,如下:

spec balance_of {

pragma aborts_if_is_strict;

aborts_if !exists<Balance<CoinType>>(owner);

}

添加这个条件后,再次尝试运行prove命令,以确认没有验证错误。

move prove

除了中止条件外,我们还想定义功能属性。在第8步中,我们将通过为定义了 BasicCoin模块的方法指定属性来对验证器进行更详细的介绍。

第8步:为 BasicCoin模块编写正式规范

withdraw 方法

方法 withdraw的签名在下面给出:

fun withdraw<CoinType>(addr: address, amount: u64) : Coin<CoinType> acquires Balance

该方法从地址addr提取价值为amount的代币,并返回一个创建的价值为amount的Coin。当1)addr没有资源Balance<CoinType>或2)addr中的代币数量小于amount时,方法withdraw中止。我们可以这样定义条件。

spec withdraw {

let balance = global<Balance<CoinType>>(addr).coin.value;

aborts_if !exists<Balance<CoinType>>(addr);

aborts_if balance < amount;

}

正如我们在这里看到的,一个规范块可以包含let绑定,它为表达式引入名称。global<T>(address)。T是一个内置函数,返回 addr处的资源值。balance是addr所拥有的代币的数量。exists<T>(address): bool是一个内置函数,如果资源T在地址处存在,则返回true。两个aborts_if子句对应上面提到的两个条件。一般来说,如果一个函数有一个以上的aborts_if条件,这些条件就会相互or-ed。默认情况下,如果用户想指定中止条件,需要列出所有可能的条件。否则,验证器将产生一个验证错误。然而,如果pragma aborts_if_is_partial在spec块中被定义,组合的中止条件(or-ed的单个条件)只意味着函数的中止。读者可以参考MSL文件了解更多信息。

下一步是定义功能属性,在下面的两个 ensures语句中描述。首先,通过使用let post绑定,balance_post表示执行后addr的余额,它应该等于balance - amount。然后,返回值(表示为result)应该是一个价值为amount的Coin。

spec withdraw {

let balance = global<Balance<CoinType>>(addr).coin.value;

aborts_if !exists<Balance<CoinType>>(addr);

aborts_if balance < amount;

let post balance_post = global<Balance<CoinType>>(addr).coin.value;

ensures balance_post == balance - amount;

ensures result == Coin<CoinType> { value: amount };

}

deposit方法

方法 deposit的签名如下:

fun deposit<CoinType>(addr: address, check: Coin<CoinType>) acquires Balance

该方法将 check存入 addr。该规范定义如下:

spec deposit {

let balance = global<Balance<CoinType>>(addr).coin.value;

let check_value = check.value;

aborts_if !exists<Balance<CoinType>>(addr);

aborts_if balance + check_value > MAX_U64;

let post balance_post = global<Balance<CoinType>>(addr).coin.value;

ensures balance_post == balance + check_value;

}

balance代表执行前addr中的代币数量,check_value代表要存入的代币数量。如果1)addr没有资源Balance<CoinType>或2)balance和check_value之和大于u64类型的最大值,该方法将终止。该功能属性检查余额在执行后是否被正确更新。

transfer 方法

方法 transfer的签名如下:

public fun transfer<CoinType: drop>(from: &signer, to: address, amount: u64, _witness: CoinType) acquires Balance

该方法从from的账户向to的地址转移amount的Coin。说明如下:

spec transfer {

let addr_from = signer::address_of(from);

let balance_from = global<Balance<CoinType>>(addr_from).coin.value;

let balance_to = global<Balance<CoinType>>(to).coin.value;

let post balance_from_post = global<Balance<CoinType>>(addr_from).coin.value;

let post balance_to_post = global<Balance<CoinType>>(to).coin.value;

ensures balance_from_post == balance_from - amount;

ensures balance_to_post == balance_to + amount;

}

addr_from是from的地址。然后得到addr_from和to在执行前和执行后的余额。ensures语句规定,从addr_from中扣除amount的代币数量,并添加到to中。然而,验证器将产生如下错误信息。

error: post-condition does not hold

┌─ ./sources/BasicCoin.move:57:9

62 │ ensures balance_from_post == balance_from - amount;

│ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

...

当addr_from等于to时,该属性不被持有。因此,我们可以在方法中添加一个断言assert!(from_addr != to),以确保addr_from不等于to。

练习

为 transfer方法实现 aborts_if条件。

实现mint和publish_balance方法的规范。

这个练习的解决方案可以在step_8_sol找到。

原文: https://github.com/move-language/move/tree/main/language/documentation/tutorial

翻译

学分: 198

分类: Move

标签:

Move 

本文已由作者铸造成 NFT

网络:

Polygon

合约地址:

0x6f772e254Ef50e9b462915b66404009c73766350

IPFS hash:

QmUx8gwmZNqFWR56PfchRLsK1PcGeDHioR7yA6VzFCH8mi

查看TA的链上存证

点赞 4

收藏 10

分享

Twitter分享

微信扫码分享

本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

你可能感兴趣的文章

move 语言开发环境搭建| try to web3 系列 (一)

38 浏览

Dacade平台SUI Move挑战者合约实践——去中心化市场DApp(Sui Move Marketplace DApp)

71 浏览

登链技术文章输出200-500一篇,摸鱼赚奶粉钱

94 浏览

sui move table_vec、vec_set

128 浏览

Sui环境-二进制文件安装

99 浏览

Dacade平台我的SUI Move挑战合约——幸运咖啡馆(Lucky Cafe)

165 浏览

相关问题

Minecraft to Blockchain

1 回答

Error[E03002]: unbound module

3 回答

1 条评论

请先 登录 后评论

MoveMoon

关注

贡献值: 65

学分: 655

Move to Moon

文章目录

关于

关于我们

社区公约

学分规则

Github

伙伴们

ChainTool

为区块链开发者准备的开源工具箱

合作

广告投放

发布课程

联系我们

友情链接

关注社区

Discord

Twitter

Youtube

B 站

公众号

关注不错过动态

微信群

加入技术圈子

©2024 登链社区 版权所有 |

Powered By Tipask3.5|

粤公网安备 44049102496617号

粤ICP备17140514号

粤B2-20230927

增值电信业务经营许可证

×

发送私信

请将文档链接发给晓娜,我们会尽快安排上架,感谢您的推荐!

发给:

内容:

取消

发送

×

举报此文章

垃圾广告信息:

广告、推广、测试等内容

违规内容:

色情、暴力、血腥、敏感信息等内容

不友善内容:

人身攻击、挑衅辱骂、恶意行为

其他原因:

请补充说明

举报原因:

取消

举报

×

如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!